1. pulseaudio启动
module-alsa-source.c
• 加载了source
在module加载pa_module_init时,创建pa_source_new。
s->outputs = pa_idxset_new(NULL, NULL);
创建一个outputs的容器(数组)
r = pa_idxset_put(core->sources, s, &s->index);
将创建的source保存在core的sources中。
• 读取数据,传输到source_output
从pcm handle中读取数据
do_read()
snd_pcm_readi()
将数据路由给关联在source上的各个outputs
pa_idxset_foreach(s->outputs, do_post, chunk)
pa_source_output_push(o, chunk);
source-output.c
pa_source_output_push()
做resample处理
将数据路由给push的回调函数
1. source 如何与source_output进行关联的?
创建source_output,与source进行关联
source-output.c
pa_source_output_new
o = malloc(sizeof(struct pa_source_output));
r = pa_idxset_put(s->outputs, o, NULL);
存入到source的outputs的容器(数组),进行了关联
Protocol-esound.c
○ 获取source
source = get_input_source(c->protocol)
pa_idxset_get_by_index(p->core->sources, p->sink_index)
○ source与outputs进行关联
c->source_output = pa_source_output_new(source, name, &ss);
○ 接收数据的回调函数
c->source_output->push = source_output_push_cb;
Protocol-native.c
○ 获取source
source = pa_idxset_get_by_index(c->protocol->core->sources, source_index);
○ source与outputs进行关联
s = record_stream_new(c, source, &ss, name, maxlength, fragment_size)
source_output = pa_source_output_new(source, name, ss)
○ 接收数据的回调函数
s->source_output->push = source_output_push_cb;
Protocol-simple.c
○ 获取source
source = pa_idxset_get_by_index(p->core->sources, p->source_index)
○ source与outputs进行关联
c->source_output = pa_source_output_new(source, c->client->name, &p->sample_spec)
○ 接收数据的回调函数
c->source_output->push = source_output_push_cb;
parec-simple.c