static void SinkInfo(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { SinkInfoStruct *sinkStruct = (SinkInfoStruct *)userdata; if (i && i->name) { bool add = false; if(sinkStruct->passthrough) { #if PA_CHECK_VERSION(1,0,0) for(int idx = 0; idx < i->n_formats; ++idx) { if(!pa_format_info_is_pcm(i->formats[idx])) { add = true; break; } } #endif } else add = true; if (add) { CStdString desc, sink; desc.Format("%s (PulseAudio)", i->description); sink.Format("pulse:%s@default", i->name); sinkStruct->list->push_back(AEDevice(desc, sink)); CLog::Log(LOGDEBUG, "PulseAudio: Found %s with devicestring %s", desc.c_str(), sink.c_str()); } } pa_threaded_mainloop_signal(sinkStruct->mainloop, 0); }
/* For PCM streams */ int pa_format_info_to_sample_spec(const pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map) { pa_assert(f); pa_assert(ss); if (!pa_format_info_is_pcm(f)) return pa_format_info_to_sample_spec_fake(f, ss, map); if (pa_format_info_get_sample_format(f, &ss->format) < 0) return -PA_ERR_INVALID; if (pa_format_info_get_rate(f, &ss->rate) < 0) return -PA_ERR_INVALID; if (pa_format_info_get_channels(f, &ss->channels) < 0) return -PA_ERR_INVALID; if (map && pa_format_info_get_channel_map(f, map) < 0) return -PA_ERR_INVALID; return 0; }
/* For PCM streams */ int pa_format_info_to_sample_spec(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map) { char *sf = NULL, *m = NULL; int rate, channels; int ret = -PA_ERR_INVALID; pa_assert(f); pa_assert(ss); if (!pa_format_info_is_pcm(f)) return pa_format_info_to_sample_spec_fake(f, ss); if (pa_format_info_get_prop_string(f, PA_PROP_FORMAT_SAMPLE_FORMAT, &sf)) goto out; if (pa_format_info_get_prop_int(f, PA_PROP_FORMAT_RATE, &rate)) goto out; if (pa_format_info_get_prop_int(f, PA_PROP_FORMAT_CHANNELS, &channels)) goto out; if ((ss->format = pa_parse_sample_format(sf)) == PA_SAMPLE_INVALID) goto out; ss->rate = (uint32_t) rate; ss->channels = (uint8_t) channels; if (map) { pa_channel_map_init(map); if (pa_format_info_get_prop_string(f, PA_PROP_FORMAT_CHANNEL_MAP, &m) == 0) if (pa_channel_map_parse(map, m) == NULL) goto out; } ret = 0; out: if (sf) pa_xfree(sf); if (m) pa_xfree(m); return ret; }