示例#1
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;
}
示例#2
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;
}