Lines Matching refs:cable
75 * call in cable->lock
79 * call in cable->lock
91 * call in cable->lock
93 unsigned int (*pos_update)(struct loopback_cable *cable);
142 struct loopback_cable *cable;
207 /* call in cable->lock */
228 /* call in cable->lock */
231 struct loopback_cable *cable = dpcm->cable;
237 err = snd_timer_start(cable->snd_timer.instance, 1);
241 * of the same cable
248 cable->snd_timer.id.card,
249 cable->snd_timer.id.device,
250 cable->snd_timer.id.subdevice,
257 /* call in cable->lock */
266 /* call in cable->lock */
269 struct loopback_cable *cable = dpcm->cable;
273 if (cable->running ^ cable->pause)
276 err = snd_timer_stop(cable->snd_timer.instance);
280 cable->snd_timer.id.card,
281 cable->snd_timer.id.device,
282 cable->snd_timer.id.subdevice,
299 struct loopback_cable *cable = dpcm->cable;
302 if (!cable->snd_timer.instance)
308 * cable->lock;
310 snd_timer_close(cable->snd_timer.instance);
313 cancel_work_sync(&cable->snd_timer.event_work);
315 snd_timer_instance_free(cable->snd_timer.instance);
316 memset(&cable->snd_timer, 0, sizeof(cable->snd_timer));
321 static int loopback_check_format(struct loopback_cable *cable, int stream)
328 if (cable->valid != CABLE_VALID_BOTH) {
333 runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]->
335 cruntime = cable->streams[SNDRV_PCM_STREAM_CAPTURE]->
345 snd_pcm_stop(cable->streams[SNDRV_PCM_STREAM_CAPTURE]->
348 runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]->
350 setup = get_setup(cable->streams[SNDRV_PCM_STREAM_PLAYBACK]);
351 card = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]->loopback->card;
382 struct loopback_cable *cable = dpcm->cable;
387 err = loopback_check_format(cable, substream->stream);
393 spin_lock(&cable->lock);
394 cable->running |= stream;
395 cable->pause &= ~stream;
396 err = cable->ops->start(dpcm);
397 spin_unlock(&cable->lock);
402 spin_lock(&cable->lock);
403 cable->running &= ~stream;
404 cable->pause &= ~stream;
405 err = cable->ops->stop(dpcm);
406 spin_unlock(&cable->lock);
412 spin_lock(&cable->lock);
413 cable->pause |= stream;
414 err = cable->ops->stop(dpcm);
415 spin_unlock(&cable->lock);
421 spin_lock(&cable->lock);
423 cable->pause &= ~stream;
424 err = cable->ops->start(dpcm);
425 spin_unlock(&cable->lock);
439 struct loopback_cable *cable = dpcm->cable;
441 cable->hw.formats = pcm_format_to_bits(runtime->format);
442 cable->hw.rate_min = runtime->rate;
443 cable->hw.rate_max = runtime->rate;
444 cable->hw.channels_min = runtime->channels;
445 cable->hw.channels_max = runtime->channels;
447 if (cable->snd_timer.instance) {
448 cable->hw.period_bytes_min =
450 cable->hw.period_bytes_max = cable->hw.period_bytes_min;
459 struct loopback_cable *cable = dpcm->cable;
462 if (cable->ops->stop_sync) {
463 err = cable->ops->stop_sync(dpcm);
490 if (!(cable->valid & ~(1 << substream->stream)) ||
494 cable->valid |= 1 << substream->stream;
601 /* call in cable->lock */
603 (struct loopback_cable *cable)
606 cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
608 cable->streams[SNDRV_PCM_STREAM_CAPTURE];
613 running = cable->running ^ cable->pause;
662 spin_lock_irqsave(&dpcm->cable->lock, flags);
663 if (loopback_jiffies_timer_pos_update(dpcm->cable) &
668 spin_unlock_irqrestore(&dpcm->cable->lock, flags);
674 spin_unlock_irqrestore(&dpcm->cable->lock, flags);
677 /* call in cable->lock */
683 struct loopback_cable *cable = dpcm->cable;
702 cable->snd_timer.id.card,
703 cable->snd_timer.id.device,
704 cable->snd_timer.id.subdevice,
711 static void loopback_snd_timer_period_elapsed(struct loopback_cable *cable,
721 spin_lock_irqsave(&cable->lock, flags);
722 running = cable->running ^ cable->pause;
725 spin_unlock_irqrestore(&cable->lock, flags);
729 dpcm_play = cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
730 dpcm_capt = cable->streams[SNDRV_PCM_STREAM_CAPTURE];
736 spin_unlock_irqrestore(&cable->lock, flags);
757 spin_unlock_irqrestore(&cable->lock, flags);
780 spin_unlock_irqrestore(&cable->lock, flags);
792 struct loopback_cable *cable = timeri->callback_data;
794 loopback_snd_timer_period_elapsed(cable, SNDRV_TIMER_EVENT_TICK,
800 struct loopback_cable *cable;
802 cable = container_of(work, struct loopback_cable, snd_timer.event_work);
803 loopback_snd_timer_period_elapsed(cable, SNDRV_TIMER_EVENT_MSTOP, 0);
811 /* Do not lock cable->lock here because timer->lock is already hold.
812 * There are other functions which first lock cable->lock and than
815 * spin_lock(&cable->lock)
824 struct loopback_cable *cable = timeri->callback_data;
834 schedule_work(&cable->snd_timer.event_work);
853 struct loopback_cable *cable = dpcm->cable;
856 cable->snd_timer.id.card,
857 cable->snd_timer.id.device,
858 cable->snd_timer.id.subdevice);
860 (cable->snd_timer.stream == SNDRV_PCM_STREAM_CAPTURE) ?
870 spin_lock(&dpcm->cable->lock);
871 if (dpcm->cable->ops->pos_update)
872 dpcm->cable->ops->pos_update(dpcm->cable);
874 spin_unlock(&dpcm->cable->lock);
913 struct loopback_cable *cable = dpcm->cable;
916 cable->valid &= ~(1 << substream->stream);
933 struct loopback_cable *cable = dpcm->cable;
938 m.bits[0] = (u_int32_t)cable->hw.formats;
939 m.bits[1] = (u_int32_t)(cable->hw.formats >> 32);
948 struct loopback_cable *cable = dpcm->cable;
952 t.min = cable->hw.rate_min;
953 t.max = cable->hw.rate_max;
964 struct loopback_cable *cable = dpcm->cable;
968 t.min = cable->hw.channels_min;
969 t.max = cable->hw.channels_max;
980 struct loopback_cable *cable = dpcm->cable;
984 t.min = cable->hw.period_bytes_min;
985 t.max = cable->hw.period_bytes_max;
997 struct loopback_cable *cable;
999 cable = loopback->cables[substream->number][dev];
1000 if (!cable)
1002 if (cable->streams[!substream->stream]) {
1004 spin_lock_irq(&cable->lock);
1005 cable->streams[substream->stream] = NULL;
1006 spin_unlock_irq(&cable->lock);
1010 if (cable->ops && cable->ops->close_cable && dpcm)
1011 cable->ops->close_cable(dpcm);
1012 /* free the cable */
1014 kfree(cable);
1104 struct loopback_cable *cable = dpcm->cable;
1107 * per playback and capture subdevice (aka cable).
1109 if (cable->snd_timer.instance)
1120 cable->snd_timer.stream = dpcm->substream->stream;
1121 cable->snd_timer.id = tid;
1138 timeri->callback_data = (void *)cable;
1142 INIT_WORK(&cable->snd_timer.event_work, loopback_snd_timer_work);
1146 * by the other device of the same cable.
1149 * Unlock cable->lock for snd_timer_close/open() call
1155 err = snd_timer_open(timeri, &cable->snd_timer.id, current->pid);
1159 cable->snd_timer.id.card,
1160 cable->snd_timer.id.device,
1161 cable->snd_timer.id.subdevice,
1167 cable->snd_timer.instance = timeri;
1189 struct loopback_cable *cable = NULL;
1202 cable = loopback->cables[substream->number][dev];
1203 if (!cable) {
1204 cable = kzalloc(sizeof(*cable), GFP_KERNEL);
1205 if (!cable) {
1209 spin_lock_init(&cable->lock);
1210 cable->hw = loopback_pcm_hardware;
1212 cable->ops = &loopback_snd_timer_ops;
1214 cable->ops = &loopback_jiffies_timer_ops;
1215 loopback->cables[substream->number][dev] = cable;
1217 dpcm->cable = cable;
1220 if (cable->ops->open) {
1221 err = cable->ops->open(dpcm);
1254 if (cable->snd_timer.instance) {
1270 runtime->hw = cable->hw;
1272 spin_lock_irq(&cable->lock);
1273 cable->streams[substream->stream] = dpcm;
1274 spin_unlock_irq(&cable->lock);
1291 if (dpcm->cable->ops->close_substream)
1292 err = dpcm->cable->ops->close_substream(dpcm);
1413 struct loopback_cable *cable;
1418 cable = loopback->cables[kcontrol->id.subdevice][kcontrol->id.device ^ 1];
1419 if (cable != NULL) {
1420 unsigned int running = cable->running ^ cable->pause;
1622 if (dpcm->cable->ops->dpcm_info)
1623 dpcm->cable->ops->dpcm_info(dpcm, buffer);
1631 struct loopback_cable *cable = loopback->cables[sub][num];
1634 if (cable == NULL) {
1638 snd_iprintf(buffer, " valid: %u\n", cable->valid);
1639 snd_iprintf(buffer, " running: %u\n", cable->running);
1640 snd_iprintf(buffer, " pause: %u\n", cable->pause);
1641 print_dpcm_info(buffer, cable->streams[0], "Playback");
1642 print_dpcm_info(buffer, cable->streams[1], "Capture");
1663 snprintf(name, sizeof(name), "cable#%d", cidx);