[alsa-cvslog] CVS: alsa-kernel/pci/korg1212 korg1212.c,1.47,1.48
Brought to you by:
perex
From: Takashi I. <ti...@us...> - 2004-08-31 09:50:26
|
Update of /cvsroot/alsa/alsa-kernel/pci/korg1212 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19003/pci/korg1212 Modified Files: korg1212.c Log Message: Summary: Korg1212 misc fixes The DSP firmware download timeout has been increased; Some concurrent device settings has been fixed (I have shameless copied some code from RME9652); and One debug message was fixed. Signed-off-by: Haroldo Gamal <ga...@al...> Index: korg1212.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/korg1212/korg1212.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- korg1212.c 4 Aug 2004 15:17:29 -0000 1.47 +++ korg1212.c 31 Aug 2004 09:50:15 -0000 1.48 @@ -168,7 +168,7 @@ #define DOORBELL_VAL_MASK 0x00FF // the doorbell value is one byte #define CARD_BOOT_DELAY_IN_MS 10 - +#define CARD_BOOT_TIMEOUT 10 #define DSP_BOOT_DELAY_IN_MS 200 #define kNumBuffers 8 @@ -382,6 +382,9 @@ snd_pcm_substream_t *playback_substream; snd_pcm_substream_t *capture_substream; + pid_t capture_pid; + pid_t playback_pid; + CardState cardState; int running; int idleMonitorOn; // indicates whether the card is in idle monitor mode. @@ -844,6 +847,20 @@ #endif /* not used */ +static inline int snd_korg1212_use_is_exclusive(korg1212_t *korg1212) +{ + unsigned long flags; + int ret = 1; + + spin_lock_irqsave(&korg1212->lock, flags); + if ((korg1212->playback_pid != korg1212->capture_pid) && + (korg1212->playback_pid >= 0) && (korg1212->capture_pid >= 0)) { + ret = 0; + } + spin_unlock_irqrestore(&korg1212->lock, flags); + return ret; +} + static int snd_korg1212_SetRate(korg1212_t *korg1212, int rate) { static ClockSourceIndex s44[] = { K1212_CLKIDX_AdatAt44_1K, @@ -855,6 +872,10 @@ K1212_CLKIDX_LocalAt48K }; int parm; + if (!snd_korg1212_use_is_exclusive (korg1212)) { + return -EBUSY; + } + switch(rate) { case 44100: parm = s44[korg1212->clkSource]; @@ -1245,7 +1266,7 @@ if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: Start DSP Download RC = %d [%s]\n", rc, stateName[korg1212->cardState]); #endif - if (! sleep_on_timeout(&korg1212->wait, HZ * 4)) + if (! sleep_on_timeout(&korg1212->wait, HZ * CARD_BOOT_TIMEOUT)) return -EBUSY; /* timeout */ snd_korg1212_OnDSPDownloadComplete(korg1212); @@ -1414,6 +1435,7 @@ spin_lock_irqsave(&korg1212->lock, flags); korg1212->playback_substream = substream; + korg1212->playback_pid = current->pid; korg1212->periodsize = K1212_PERIODS; korg1212->channels = K1212_CHANNELS; @@ -1444,6 +1466,7 @@ spin_lock_irqsave(&korg1212->lock, flags); korg1212->capture_substream = substream; + korg1212->capture_pid = current->pid; korg1212->periodsize = K1212_PERIODS; korg1212->channels = K1212_CHANNELS; @@ -1466,6 +1489,7 @@ spin_lock_irqsave(&korg1212->lock, flags); + korg1212->playback_pid = -1; korg1212->playback_substream = NULL; korg1212->periodsize = 0; @@ -1486,6 +1510,7 @@ spin_lock_irqsave(&korg1212->lock, flags); + korg1212->capture_pid = -1; korg1212->capture_substream = NULL; korg1212->periodsize = 0; @@ -1522,22 +1547,45 @@ unsigned long flags; korg1212_t *korg1212 = snd_pcm_substream_chip(substream); int err; + pid_t this_pid; + pid_t other_pid; #if K1212_DEBUG_LEVEL > 0 K1212_DEBUG_PRINTK("K1212_DEBUG: snd_korg1212_hw_params [%s]\n", stateName[korg1212->cardState]); #endif spin_lock_irqsave(&korg1212->lock, flags); + + if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) { + this_pid = korg1212->playback_pid; + other_pid = korg1212->capture_pid; + } else { + this_pid = korg1212->capture_pid; + other_pid = korg1212->playback_pid; + } + + if ((other_pid > 0) && (this_pid != other_pid)) { + + /* The other stream is open, and not by the same + task as this one. Make sure that the parameters + that matter are the same. + */ + + if ((int)params_rate(params) != korg1212->clkRate) { + spin_unlock_irqrestore(&korg1212->lock, flags); + _snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_RATE); + return -EBUSY; + } + + spin_unlock_irqrestore(&korg1212->lock, flags); + return 0; + } + if ((err = snd_korg1212_SetRate(korg1212, params_rate(params))) < 0) { spin_unlock_irqrestore(&korg1212->lock, flags); return err; } -/* - if (params_format(params) != SNDRV_PCM_FORMAT_S16_LE) { - spin_unlock_irqrestore(&korg1212->lock, flags); - return -EINVAL; - } -*/ + korg1212->channels = params_channels(params); korg1212->periodsize = K1212_PERIOD_BYTES; @@ -2183,6 +2231,8 @@ korg1212->opencnt = 0; korg1212->playcnt = 0; korg1212->setcnt = 0; + korg1212->playback_pid = -1; + korg1212->capture_pid = -1; snd_korg1212_setCardState(korg1212, K1212_STATE_UNINITIALIZED); korg1212->idleMonitorOn = 0; korg1212->clkSrcRate = K1212_CLKIDX_LocalAt44_1K; @@ -2312,7 +2362,7 @@ #if K1212_DEBUG_LEVEL > 0 K1212_DEBUG_PRINTK("K1212_DEBUG: Record Data Area = 0x%p (0x%08x), %d bytes\n", - korg1212->recordDataBufsPtr, korg1212->RecDataBufsPhy, korg1212->DataBufsSize); + korg1212->recordDataBufsPtr, korg1212->RecDataPhy, korg1212->DataBufsSize); #endif #else // K1212_LARGEALLOC |