[alsa-devel] regarding setting of fragment size in usbaudio driver
Hi ,
i am using a OSS based usbaudio application for usb audio streaming .
my usb audio device is capture only device .
i want to set the fragment size of usbaudio alsa driver to reduce latency problem coming in my application .
currently even if my application reads 4k data from userspace , i observed driver will buffer for 100 ms data ( period size data )= 16 k at 44100 frquency
and after driver reads 16k data , read call will return with 4k data . so read() call remains blocked for 100ms which is causing some latency problem .
i used SNDCTL_DSP_SETFRAGMENT ioctl , but still driver behaviour to buffer 100ms data remained same .
how driver's fragment size in driver can be set to some less value in OSS based application .
Can some patch be implemented in kernel space to do that .?
Thanx & Regards Amit Nagal
Amit Nagal wrote:
i am using a OSS based usbaudio application for usb audio streaming .
my usb audio device is capture only device .
i want to set the fragment size of usbaudio alsa driver to reduce latency problem coming in my application .
currently even if my application reads 4k data from userspace , i observed driver will buffer for 100 ms data ( period size data )= 16 k at 44100 frquency
and after driver reads 16k data , read call will return with 4k data . so read() call remains blocked for 100ms which is causing some latency problem .
There is no extra buffer in the driver. There seems to be something wrong with your algorithm.
Does recording with the arecord tool work?
Regards, Clemens
Hi ,
Thanx for the reply .
Actually on my embedded target , i am not using arecord , but reading from (/dev/dsp0) capture data .
i have 2 question :
i used SNDCTL_DSP_GETBLKSIZE ioctl to find the fragment size of driver . i found it to be 16k .
1) now if the application reads 4k data from userspace , read call will remain blocked for audio driver's fragment size usb data read ( 16k) or app_request_size(4k) ?
2)time taken for read(4k) = time_taken(fragment size read ) or time_taken(app_request_size=4k) ?
thanx & regards amit nagal
On Mon, Dec 13, 2010 at 6:04 PM, Clemens Ladisch clemens@ladisch.de wrote:
Amit Nagal wrote:
i am using a OSS based usbaudio application for usb audio streaming .
my usb audio device is capture only device .
i want to set the fragment size of usbaudio alsa driver to reduce latency problem coming in my application .
currently even if my application reads 4k data from userspace , i observed driver will buffer for 100 ms data ( period size data )= 16 k at 44100 frquency
and after driver reads 16k data , read call will return with 4k data . so read() call remains blocked for 100ms which is causing some latency problem .
There is no extra buffer in the driver. There seems to be something wrong with your algorithm.
Does recording with the arecord tool work?
Regards, Clemens
(please don't top-post)
Amit Nagal wrote:
i used SNDCTL_DSP_GETBLKSIZE ioctl to find the fragment size of driver . i found it to be 16k .
- now if the application reads 4k data from userspace , read call
will remain blocked for audio driver's fragment size usb data read ( 16k) or app_request_size(4k) ?
If, when read() is called, there is enough data in the buffer, it will return that data and return immediately. Otherwise, it will wait for the hardware to reach the next period boundary (in OSS: fragment boundary) and try again.
If you want to have shorter waits, use lower fragment sizes.
Regards, Clemens
(please don't top-post)
Extremely sorry for that . will take care reagarding this from now on .
If, when read() is called, there is enough data in the buffer, it will return that data and return immediately. Otherwise, it will wait for the hardware to reach the next period boundary (in OSS: fragment boundary) and try again.
If you want to have shorter waits, use lower fragment sizes.
yes , setting of lower fragment size is my requirement at the moment in OSS application . i tried to use SNDCTL_DSP_SETFRAGMENT ioctl to set lower fragment size . but audio driver uses default fragment size only and not the fragment size desired by application . Is it possible to change fragment size in kernel space ?
Thanx & Regards Amit Nagal
Amit Nagal wrote:
If you want to have shorter waits, use lower fragment sizes.
yes , setting of lower fragment size is my requirement at the moment in OSS application . i tried to use SNDCTL_DSP_SETFRAGMENT ioctl to set lower fragment size .
In theory, this should work.
but audio driver uses default fragment size only and not the fragment size desired by application .
Does it return an error? If yes, try moving this call before some other parameter setting ioctls.
Regards, Clemens
participants (2)
-
Amit Nagal
-
Clemens Ladisch