static void cobalt_alsa_pb_pcm_data(struct snd_cobalt_card *cobsc, u8 *pcm_data, size_t skip, size_t samples) { struct snd_pcm_substream *substream; struct snd_pcm_runtime *runtime; unsigned long flags; unsigned int pos; unsigned int stride; bool is_s32; unsigned i; dprintk("cobalt alsa pb ptr=%p data=%p samples=%zd\n", cobsc, pcm_data, samples); substream = cobsc->playback_pcm_substream; if (substream == NULL) { dprintk("substream was NULL\n"); return; } runtime = substream->runtime; if (runtime == NULL) { dprintk("runtime was NULL\n"); return; } is_s32 = runtime->format == SNDRV_PCM_FORMAT_S32_LE; stride = runtime->frame_bits >> 3; if (stride == 0) { dprintk("stride is zero\n"); return; } if (samples == 0) { dprintk("%s: samples was zero\n", __func__); return; } if (runtime->dma_area == NULL) { dprintk("dma area was NULL - ignoring\n"); return; } pos = cobsc->pb_pos % cobsc->pb_size; for (i = 0; i < cobsc->pb_count / (8 * 4); i++) pb_sample_cpy(pcm_data + i * skip, runtime->dma_area + pos + i * stride, stride, is_s32); snd_pcm_stream_lock_irqsave(substream, flags); cobsc->pb_pos += i * stride; snd_pcm_stream_unlock_irqrestore(substream, flags); if (cobsc->pb_pos % cobsc->pb_count == 0) snd_pcm_period_elapsed(substream); }
static void abort_alsa_playback(struct ua101 *ua) { unsigned long flags; if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states)) { snd_pcm_stream_lock_irqsave(ua->playback.substream, flags); snd_pcm_stop(ua->playback.substream, SNDRV_PCM_STATE_XRUN); snd_pcm_stream_unlock_irqrestore(ua->playback.substream, flags); } }
static void abort_alsa_capture(struct ua101 *ua) { unsigned long flags; if (test_bit(ALSA_CAPTURE_RUNNING, &ua->states)) { snd_pcm_stream_lock_irqsave(ua->capture.substream, flags); snd_pcm_stop(ua->capture.substream, SNDRV_PCM_STATE_XRUN); snd_pcm_stream_unlock_irqrestore(ua->capture.substream, flags); } }
static void bcm947xx_dma_abort(struct snd_pcm_substream *substream) { if (snd_pcm_running(substream)) { unsigned long flags; DBG("%s XRUN\n", __FUNCTION__); snd_pcm_stream_lock_irqsave(substream, flags); snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); snd_pcm_stream_unlock_irqrestore(substream, flags); } }
static void hdmi_audio_abort_stream(struct snd_pcm_substream *substream) { unsigned long flags; snd_pcm_stream_lock_irqsave(substream, flags); if (snd_pcm_running(substream)) substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_STOP); snd_pcm_stream_unlock_irqrestore(substream, flags); }
static void hdmi_audio_abort_stream(struct snd_pcm_substream *substream) { unsigned long flags; snd_pcm_stream_lock_irqsave(substream, flags); if (snd_pcm_running(substream)) snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); snd_pcm_stream_unlock_irqrestore(substream, flags); }
static void dmaengine_pcm_dma_complete(void *arg) { struct snd_pcm_substream *substream = NULL; struct dmaengine_pcm_runtime_data *prtd = NULL; unsigned long flags; substream = arg; if (!substream) { return; } snd_pcm_stream_lock_irqsave(substream, flags); if (!substream->runtime) { snd_pcm_stream_unlock_irqrestore(substream, flags); return; } prtd = substream_to_prtd(substream); prtd->pos += snd_pcm_lib_period_bytes(substream); if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream)) prtd->pos = 0; snd_pcm_stream_unlock_irqrestore(substream, flags); snd_pcm_period_elapsed(substream); }
int snd_ak4114_check_rate_and_errors(struct ak4114 *ak4114, unsigned int flags) { struct snd_pcm_runtime *runtime = ak4114->capture_substream ? ak4114->capture_substream->runtime : NULL; unsigned long _flags; int res = 0; unsigned char rcs0, rcs1; unsigned char c0, c1; rcs1 = reg_read(ak4114, AK4114_REG_RCS1); if (flags & AK4114_CHECK_NO_STAT) goto __rate; rcs0 = reg_read(ak4114, AK4114_REG_RCS0); spin_lock_irqsave(&ak4114->lock, _flags); if (rcs0 & AK4114_PAR) ak4114->parity_errors++; if (rcs1 & AK4114_V) ak4114->v_bit_errors++; if (rcs1 & AK4114_CCRC) ak4114->ccrc_errors++; if (rcs1 & AK4114_QCRC) ak4114->qcrc_errors++; c0 = (ak4114->rcs0 & (AK4114_QINT | AK4114_CINT | AK4114_PEM | AK4114_AUDION | AK4114_AUTO | AK4114_UNLCK)) ^ (rcs0 & (AK4114_QINT | AK4114_CINT | AK4114_PEM | AK4114_AUDION | AK4114_AUTO | AK4114_UNLCK)); c1 = (ak4114->rcs1 & 0xf0) ^ (rcs1 & 0xf0); ak4114->rcs0 = rcs0 & ~(AK4114_QINT | AK4114_CINT); ak4114->rcs1 = rcs1; spin_unlock_irqrestore(&ak4114->lock, _flags); ak4114_notify(ak4114, rcs0, rcs1, c0, c1); if (ak4114->change_callback && (c0 | c1) != 0) ak4114->change_callback(ak4114, c0, c1); __rate: /* compare rate */ res = external_rate(rcs1); if (!(flags & AK4114_CHECK_NO_RATE) && runtime && runtime->rate != res) { snd_pcm_stream_lock_irqsave(ak4114->capture_substream, _flags); if (snd_pcm_running(ak4114->capture_substream)) { // printk(KERN_DEBUG "rate changed (%i <- %i)\n", runtime->rate, res); snd_pcm_stop(ak4114->capture_substream, SNDRV_PCM_STATE_DRAINING); res = 1; } snd_pcm_stream_unlock_irqrestore(ak4114->capture_substream, _flags); } return res; }
int mxc_hdmi_register_audio(struct snd_pcm_substream *substream) { unsigned long flags, flags1; int ret = 0; snd_pcm_stream_lock_irqsave(substream, flags); if (substream && check_hdmi_state()) { spin_lock_irqsave(&hdmi_audio_lock, flags1); if (hdmi_audio_stream_playback) { pr_err("%s unconsist hdmi auido stream!\n", __func__); ret = -EINVAL; } hdmi_audio_stream_playback = substream; spin_unlock_irqrestore(&hdmi_audio_lock, flags1); } else ret = -EINVAL; snd_pcm_stream_unlock_irqrestore(substream, flags); return ret; }
int snd_ak4117_check_rate_and_errors(struct ak4117 *ak4117, unsigned int flags) { struct snd_pcm_runtime *runtime = ak4117->substream ? ak4117->substream->runtime : NULL; unsigned long _flags; int res = 0; unsigned char rcs0, rcs1, rcs2; unsigned char c0, c1; rcs1 = reg_read(ak4117, AK4117_REG_RCS1); if (flags & AK4117_CHECK_NO_STAT) goto __rate; rcs0 = reg_read(ak4117, AK4117_REG_RCS0); rcs2 = reg_read(ak4117, AK4117_REG_RCS2); // printk(KERN_DEBUG "AK IRQ: rcs0 = 0x%x, rcs1 = 0x%x, rcs2 = 0x%x\n", rcs0, rcs1, rcs2); spin_lock_irqsave(&ak4117->lock, _flags); if (rcs0 & AK4117_PAR) ak4117->parity_errors++; if (rcs0 & AK4117_V) ak4117->v_bit_errors++; if (rcs2 & AK4117_CCRC) ak4117->ccrc_errors++; if (rcs2 & AK4117_QCRC) ak4117->qcrc_errors++; c0 = (ak4117->rcs0 & (AK4117_QINT | AK4117_CINT | AK4117_STC | AK4117_AUDION | AK4117_AUTO | AK4117_UNLCK)) ^ (rcs0 & (AK4117_QINT | AK4117_CINT | AK4117_STC | AK4117_AUDION | AK4117_AUTO | AK4117_UNLCK)); c1 = (ak4117->rcs1 & (AK4117_DTSCD | AK4117_NPCM | AK4117_PEM | 0x0f)) ^ (rcs1 & (AK4117_DTSCD | AK4117_NPCM | AK4117_PEM | 0x0f)); ak4117->rcs0 = rcs0 & ~(AK4117_QINT | AK4117_CINT | AK4117_STC); ak4117->rcs1 = rcs1; ak4117->rcs2 = rcs2; spin_unlock_irqrestore(&ak4117->lock, _flags); if (rcs0 & AK4117_PAR) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[0]->id); if (rcs0 & AK4117_V) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[1]->id); if (rcs2 & AK4117_CCRC) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[2]->id); if (rcs2 & AK4117_QCRC) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[3]->id); /* rate change */ if (c1 & 0x0f) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[4]->id); if ((c1 & AK4117_PEM) | (c0 & AK4117_CINT)) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[6]->id); if (c0 & AK4117_QINT) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[8]->id); if (c0 & AK4117_AUDION) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[9]->id); if (c1 & AK4117_NPCM) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[10]->id); if (c1 & AK4117_DTSCD) snd_ctl_notify(ak4117->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4117->kctls[11]->id); if (ak4117->change_callback && (c0 | c1) != 0) ak4117->change_callback(ak4117, c0, c1); __rate: /* compare rate */ res = external_rate(rcs1); if (!(flags & AK4117_CHECK_NO_RATE) && runtime && runtime->rate != res) { snd_pcm_stream_lock_irqsave(ak4117->substream, _flags); if (snd_pcm_running(ak4117->substream)) { // printk(KERN_DEBUG "rate changed (%i <- %i)\n", runtime->rate, res); snd_pcm_stop(ak4117->substream, SNDRV_PCM_STATE_DRAINING); wake_up(&runtime->sleep); res = 1; } snd_pcm_stream_unlock_irqrestore(ak4117->substream, _flags); } return res; }
static void cobalt_alsa_announce_pcm_data(struct snd_cobalt_card *cobsc, u8 *pcm_data, size_t skip, size_t samples) { struct snd_pcm_substream *substream; struct snd_pcm_runtime *runtime; unsigned long flags; unsigned int oldptr; unsigned int stride; int length = samples; int period_elapsed = 0; bool is_s32; dprintk("cobalt alsa announce ptr=%p data=%p num_bytes=%zd\n", cobsc, pcm_data, samples); substream = cobsc->capture_pcm_substream; if (substream == NULL) { dprintk("substream was NULL\n"); return; } runtime = substream->runtime; if (runtime == NULL) { dprintk("runtime was NULL\n"); return; } is_s32 = runtime->format == SNDRV_PCM_FORMAT_S32_LE; stride = runtime->frame_bits >> 3; if (stride == 0) { dprintk("stride is zero\n"); return; } if (length == 0) { dprintk("%s: length was zero\n", __func__); return; } if (runtime->dma_area == NULL) { dprintk("dma area was NULL - ignoring\n"); return; } oldptr = cobsc->hwptr_done_capture; if (oldptr + length >= runtime->buffer_size) { unsigned int cnt = runtime->buffer_size - oldptr; unsigned i; for (i = 0; i < cnt; i++) sample_cpy(runtime->dma_area + (oldptr + i) * stride, pcm_data + i * skip, stride, is_s32); for (i = cnt; i < length; i++) sample_cpy(runtime->dma_area + (i - cnt) * stride, pcm_data + i * skip, stride, is_s32); } else { unsigned i; for (i = 0; i < length; i++) sample_cpy(runtime->dma_area + (oldptr + i) * stride, pcm_data + i * skip, stride, is_s32); } snd_pcm_stream_lock_irqsave(substream, flags); cobsc->hwptr_done_capture += length; if (cobsc->hwptr_done_capture >= runtime->buffer_size) cobsc->hwptr_done_capture -= runtime->buffer_size; cobsc->capture_transfer_done += length; if (cobsc->capture_transfer_done >= runtime->period_size) { cobsc->capture_transfer_done -= runtime->period_size; period_elapsed = 1; } snd_pcm_stream_unlock_irqrestore(substream, flags); if (period_elapsed) snd_pcm_period_elapsed(substream); }
int snd_ak4114_check_rate_and_errors(ak4114_t *ak4114, unsigned int flags) { snd_pcm_runtime_t *runtime = ak4114->capture_substream ? ak4114->capture_substream->runtime : NULL; unsigned long _flags; int res = 0; unsigned char rcs0, rcs1; unsigned char c0, c1; rcs1 = reg_read(ak4114, AK4114_REG_RCS1); if (flags & AK4114_CHECK_NO_STAT) goto __rate; rcs0 = reg_read(ak4114, AK4114_REG_RCS0); spin_lock_irqsave(&ak4114->lock, _flags); if (rcs0 & AK4114_PAR) ak4114->parity_errors++; if (rcs1 & AK4114_V) ak4114->v_bit_errors++; if (rcs1 & AK4114_CCRC) ak4114->ccrc_errors++; if (rcs1 & AK4114_QCRC) ak4114->qcrc_errors++; c0 = (ak4114->rcs0 & (AK4114_QINT | AK4114_CINT | AK4114_PEM | AK4114_AUDION | AK4114_AUTO | AK4114_UNLCK)) ^ (rcs0 & (AK4114_QINT | AK4114_CINT | AK4114_PEM | AK4114_AUDION | AK4114_AUTO | AK4114_UNLCK)); c1 = (ak4114->rcs1 & 0xf0) ^ (rcs1 & 0xf0); ak4114->rcs0 = rcs0 & ~(AK4114_QINT | AK4114_CINT); ak4114->rcs1 = rcs1; spin_unlock_irqrestore(&ak4114->lock, _flags); if (rcs0 & AK4114_PAR) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[0]->id); if (rcs0 & AK4114_V) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[1]->id); if (rcs1 & AK4114_CCRC) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[2]->id); if (rcs1 & AK4114_QCRC) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[3]->id); /* rate change */ if (c1 & 0xf0) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[4]->id); if ((c0 & AK4114_PEM) | (c0 & AK4114_CINT)) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[9]->id); if (c0 & AK4114_QINT) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[10]->id); if (c0 & AK4114_AUDION) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[11]->id); if (c0 & AK4114_AUTO) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[12]->id); if (c0 & AK4114_DTSCD) snd_ctl_notify(ak4114->card, SNDRV_CTL_EVENT_MASK_VALUE, &ak4114->kctls[13]->id); if (ak4114->change_callback && (c0 | c1) != 0) ak4114->change_callback(ak4114, c0, c1); __rate: /* compare rate */ res = external_rate(rcs1); if (!(flags & AK4114_CHECK_NO_RATE) && runtime && runtime->rate != res) { snd_pcm_stream_lock_irqsave(ak4114->capture_substream, _flags); if (snd_pcm_running(ak4114->capture_substream)) { // printk("rate changed (%i <- %i)\n", runtime->rate, res); snd_pcm_stop(ak4114->capture_substream, SNDRV_PCM_STATE_DRAINING); res = 1; } snd_pcm_stream_unlock_irqrestore(ak4114->capture_substream, _flags); } return res; }