loopback snd_pcm_writei

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I have the configuration in the asound.conf above.

my_plug - - > my_route - - > my_multi - - > slave0 (forward)
                                      - - > slave1 (loopback)

I open the plug my_plug in the block mode:

    writtenFrames = snd_pcm_writei(handle, bufferToWrite, bufferToWriteSize);

The issue I see is that there are several "writes" with 0 written frames. It seems like the snd_pcm_writei does not hold until data will be written. In general, 0 written frames sounds weird to me, because snd_pcm_writei should block itself if no space is available in the circular buffer right?

I have tried to fix the following method in pcm_multi.c, as Jaroslav Kysela suggests.

-static int snd_pcm_multi_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail ATTRIBUTE_UNUSED)
+static int snd_pcm_multi_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail)
{
        snd_pcm_multi_t *multi = pcm->private_data;
-       snd_pcm_t *slave = multi->slaves[multi->master_slave].pcm;
-       return snd_pcm_may_wait_for_avail_min(slave, snd_pcm_mmap_avail(slave));
+       unsigned int i;
+       for (i = 0; i < multi->slaves_count; ++i) {
+               if (snd_pcm_may_wait_for_avail_min(multi->slaves[i].pcm, avail))
+                       return 1;
+       }
+       return 0;
}

But unfortunately the issue has not been resolved.


#*************************************************
#                     PLAYBACK
#*************************************************

pcm.my_plug
{
  type plug
  slave.pcm my_route
  slave.channels 2
}

pcm.my_route
{
  type route
  slave.pcm my_multi
  slave.channels 4
  ttable.0.0 1
  ttable.0.1 1
  ttable.1.2 1
  ttable.1.3 1
}

pcm.my_multi
{
  type multi
  slaves
  {
    slave0
    {
      pcm my_dmix
      channels 2
    }
    slave1
    {
      pcm my_dmix_loop
      channels 2
    }
  }
  bindings
  {
    0 {slave slave0 channel 0}
    1 {slave slave0 channel 1}
    2 {slave slave1 channel 0}
    3 {slave slave1 channel 1}
  }
}

#-------------------- Slave 0 --------------------

pcm.my_dmix
{
  type dmix
  ipc_key 1000
  ipc_key_add_uid 1
  ipc_perm 0600
  slave.period_time 10000
  slave.period_size 480
  slave.buffer_size 3840
  slave.rate 48000
  slave.pcm "hw:0,0"
}

#-------------------- Slave 1 --------------------

pcm.my_dmix_loop
{
  type dmix
  ipc_key 1000
  ipc_key_add_uid 1
  ipc_perm 0600
  slave.period_time 10000
  slave.period_size 480
  slave.buffer_size 3840
  slave.rate 48000
  slave.pcm my_loopback_out
}

pcm.my_loopback_out
{
  type hw
  card Loopback
  device 0
  subdevice 0
}

#*************************************************
#                     CAPTURE
#*************************************************

pcm.my_dsnoop_loop
{
  type dsnoop
  ipc_key 1000
  ipc_key_add_uid 1
  ipc_perm 0600
  slave.period_time 10000
  slave.period_size 480
  slave.buffer_size 3840
  slave.rate 48000
  slave.pcm my_loopback_in
}

pcm.my_loopback_in
{
  type hw
  card Loopback
  device 1
  subdevice 0
}

_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux