[alsa-devel] problem with copy function

Shahram Shabpareh shabpareh.shahram.7 at gmail.com
Wed Jul 20 08:28:24 CEST 2016


Hi
Thanks for reply

I switched from interleaved to non interleaved mode with the following
command and problem solved. no need to implement the copy function.

aplay -vv -c 32 -f u8 -D plughw:0,0 -I file.wav null.wav null.wav null.wav
null.wav null.wav null.wav null.wav null.wav null.wav null.wav null.wav
null.wav null.wav null.wav null.wav null.wav null.wav null.wav null.wav
null.wav null.wav null.wav null.wav null.wav null.wav null.wav null.wav
null.wav null.wav null.wav null.wav

the null.wav file is created from /dev/zero with dd command

On Tue, Jul 19, 2016 at 6:51 PM, Takashi Sakamoto <o-takashi at sakamocchi.jp>
wrote:

> Hi,
>
> On Jul 19 2016 16:56, Shahram Shabpareh wrote:
> > I have a board with ti am3358 processor. it has a sound port called McASP
> > and I've used IDT821034 as codec. The Linux kernel source package that is
> > included by board company is 3.2.0 and I wrote a basic driver for
> IDT821034
> > codec and changed the code of davinci-mcasp.c . Now the basic
> functionality
> > of system is ok and i have signals on oscilloscope. Another thing is i
> have
> > to setup a specific configuration for this system. the target system must
> > have 32 tdm slots in each frame and 32 PCM channels and each slot is 8
> > bits. this is also done in kernel source code. currently the problem is i
> > want that data of channel 1 be mapped to slot 1, channel 2 be mapped to
> > slot 2, .... and channel 32 be mapped to slot 32. but when i run aplay to
> > send to only channel 1, data will be send to all slots! i want that all
> > slots be 0 except slot 1. How can i do that?
> >
> > I searched in source tree and found the function that i need to override
> > this behaviour is copy that is defined in snd_pcm_ops structure. I
> defined
> > a function called davinci_pcm_copy in davinci-pcm.c file and added the
> > function to structure like below:
> >
> > static struct snd_pcm_ops davinci_pcm_ops = {
> >     ....
> >     .copy = davinci_pcm_copy,
> > };
> >
> > the problem is, this copy function is not called at all by kernel pcm
> > subsystem.
> >
> > Again i searched the kernel code and found that copy function has a
> calling
> > path as below:
> >
> > alsa-lib -> snd_pcm_playback_ioctl -> snd_pcm_playback_ioctl1 ->
> > snd_pcm_lib_write -> snd_pcm_lib_write1 -> snd_pcm_lib_write_transfer ->
> > copy
> >
> > but my calling path is:
> >
> > alsa-lib -> snd_pcm_playback_ioctl -> snd_pcm_playback_ioctl1 ->
> > snd_pcm_common_ioctl1 -> snd_pcm_sync_ptr
> >
> > I created a wav file from a mp3 file with this command:
> >
> > ffmpeg -i file.mp3 -ac 1 -ar 8000 -ab 64k -f u8 file.wav
> >
> > and played with this command:
> >
> > aplay -vv -c 1 file.wav
> >
> > Strange thing is when i run this aplay command in my PC the first calling
> > path is executed but when i run the same aplay with same file in my board
> > the second calling path is executed. Is it related to software and
> hardware
> > params of sound devices? if yes, what should i do to copy function being
> > called in my board?
>
> Would you check output of aplay command in a point of 'access' way? Like:
>
> $ aplay -v -D hw:0,0 -f S16_LE -r 44100 -c 2 /dev/urandom
> ...
> Hardware PCM card 0 'HDA Intel PCH' device 0 subdevice 0
> Its setup is:
>   stream       : PLAYBACK
>   access       : RW_INTERLEAVED
> ...
>
> In this case, the process executes ioctl(2) with
> SNDRV_PCM_IOCTL_WRITEI_FRAMES, thus the .copy() in kernel is probably
> executed.
>
> But in this case:
> $ aplay -v -D plughw:0,0 /dev/urandom
> ...
> Slave: Hardware PCM card 0 'HDA Intel PCH' device 0 subdevice 0
> Its setup is:
>   stream       : PLAYBACK
>   access       : MMAP_INTERLEAVED
> ...
>
> The process run with mmap(2)ed page frame, thus PCM frames are not
> transferred by ioctl(2).
>
> Before going to the details, please check it.
>
>
> Regards
>
> Takashi Sakamoto
>


More information about the Alsa-devel mailing list