Greetings,
I'm setting out to write an ALSA driver for a very limited device thats behind a PLD. The actual codec is a uda1380 and does 16bit MSB stereo encode/decode. The way the device is driven the sampling rate is limited to 8KHz and data transfer to/from the device I have to handle manually.
I've read over the 'writing an ALSA driver' tutorial and have started the driver but have run into a few questions:
- for the specs I've given above: 8000Hz sampling rate, 16bit stereo MSB samples does the following snd_pcm_hardware_t look right?:
static snd_pcm_hardware_t my_playback_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID), .formats = SNDRV_PCM_FMTBIT_U16_BE, // is this 16bit MSB? .rates = SNDRV_PCM_RATE_8000, // seems redundant? .rate_min = 8000, .rate_max = 8000, .channels_min = 2, .channels_max = 2, .buffer_bytes_max = 32768, .period_bytes_min = 4096, .period_bytes_max = 32768, .periods_min = 1, .periods_max = 1024, };
- I'm a little confused at how to deal with copying data from/to the device. It looks like I would implement the copy callback and copy the passed buffer to the device in the device specific manner I need to (playback), but I'm not clear where to put data that I receive from the device (capture). I notice that when the hw_params callback is called a dma buffer has been created by ALSA in the substream->runtime struct. I assume this is created based on hte buffer_bytes_max field above and I'm to copy data to this buffer? How do I know where to copy it within the buffer and what data ALSA has already consumed from the buffer?
- I might need to create an intermediate buffer between ALSA's rather large buffers and my hardware buffer. Is there any driver that I could look at that does this? The tutorial talks about the vxpocket driver but that code looks very foriegn from the rest of the ALSA drivers.
- I'm not sure I understand what the 'period' is about. Its clear to me that I need to call snd_pcm_period_elapsed() periodically from either an IRQ or other timed callback, but I'm not clear what the hardware pointer is or how that converts to 'frames' and 'periods'.
- in general, if my hardware device only allows 16bit MSB 8KHz, does ALSA provides a mechanism for converting data from other formats?
Thanks for any pointers,
Tim