Linux Sound Drivers Framework: Barry Song (宋宝华)
Linux Sound Drivers Framework: Barry Song (宋宝华)
OSS
dsp mixer
file_operations file_operations
SOUND_MIXER_MIC
DMA transmit …
DMA interrupt
Typical OSS Read/Write Flow
Wake-up
Audio interrupt
ALSA Framework
ALSA Dataflow
snd_pcm_ops functions
static struct snd_pcm_ops snd_ad1938_playback_ops = {
.open = snd_ad1938_playback_open,
.close = snd_ad1938_playback_close,
.ioctl = snd_pcm_lib_ioctl, sound core return frames
.hw_params = snd_ad1938_hw_params,
.hw_free = snd_ad1938_hw_free, START/STOP..
.prepare = snd_ad1938_playback_prepare,
.trigger = snd_ad1938_playback_trigger,
.pointer = snd_ad1938_playback_pointer,
trigger pointer
.copy = snd_ad1938_playback_copy,
.silence = snd_ad1938_playback_silence, snd_pcm_period_elapsed
};
Not like OSS, ALSA sound core will manage flow control with the help of low
level driver callbacks.
ASoC: ALSA on SoC
ASoC splits an embedded audio system into 3 components :-
* Codec driver: The codec driver is platform independent and contains audio
controls, audio interface capabilities, codec DAPM definition and codec IO
functions.
* Platform driver: The platform driver contains the audio DMA engine and audio
interface drivers (e.g. I2S, AC97, PCM) for that platform.
* Machine driver: The machine driver handles any machine specific controls an
d audio events (e.g. turning on an amp at start of playback).
SoC Core:
Traditional ALSA Driver
if (platform->pcm_ops->prepare) {
ret = platform->pcm_ops->prepare(substream);
}
if (codec_dai->ops->prepare) {
ret = codec_dai->ops->prepare(substream, codec_dai);
}
if (cpu_dai->ops->prepare) {
ret = cpu_dai->ops->prepare(substream, cpu_dai);
}
...
}