mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
core-format: Add pa_format_info_from_sample_spec2()
The function will be used in pa_sink_input_new() and pa_source_output_new() to convert the sample spec given by the client to a format info object. The set_format, set_rate and set_channels will be set according to the stream flags (PA_SINK_INPUT_FIX_FORMAT etc.).
This commit is contained in:
parent
30a32d35c8
commit
d78d8246b4
2 changed files with 55 additions and 0 deletions
|
|
@ -117,6 +117,43 @@ int pa_format_info_get_channel_map(pa_format_info *f, pa_channel_map *map) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pa_format_info *pa_format_info_from_sample_spec2(const pa_sample_spec *ss, const pa_channel_map *map, bool set_format,
|
||||||
|
bool set_rate, bool set_channels) {
|
||||||
|
pa_format_info *format = NULL;
|
||||||
|
|
||||||
|
pa_assert(ss);
|
||||||
|
|
||||||
|
format = pa_format_info_new();
|
||||||
|
format->encoding = PA_ENCODING_PCM;
|
||||||
|
|
||||||
|
if (set_format)
|
||||||
|
pa_format_info_set_sample_format(format, ss->format);
|
||||||
|
|
||||||
|
if (set_rate)
|
||||||
|
pa_format_info_set_rate(format, ss->rate);
|
||||||
|
|
||||||
|
if (set_channels) {
|
||||||
|
pa_format_info_set_channels(format, ss->channels);
|
||||||
|
|
||||||
|
if (map) {
|
||||||
|
if (map->channels != ss->channels) {
|
||||||
|
pa_log_debug("Channel map is incompatible with the sample spec.");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_format_info_set_channel_map(format, map);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return format;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (format)
|
||||||
|
pa_format_info_free(format);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int pa_format_info_to_sample_spec2(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map, pa_sample_spec *fallback_ss,
|
int pa_format_info_to_sample_spec2(pa_format_info *f, pa_sample_spec *ss, pa_channel_map *map, pa_sample_spec *fallback_ss,
|
||||||
pa_channel_map *fallback_map) {
|
pa_channel_map *fallback_map) {
|
||||||
int r, r2;
|
int r, r2;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
#include <pulse/format.h>
|
#include <pulse/format.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
/* Gets the sample format stored in the format info. Returns a negative error
|
/* Gets the sample format stored in the format info. Returns a negative error
|
||||||
* code on failure. If the sample format property is not set at all, returns
|
* code on failure. If the sample format property is not set at all, returns
|
||||||
* -PA_ERR_NOENTITY. */
|
* -PA_ERR_NOENTITY. */
|
||||||
|
|
@ -42,6 +44,22 @@ int pa_format_info_get_channels(pa_format_info *f, uint8_t *channels);
|
||||||
* -PA_ERR_NOENTITY. */
|
* -PA_ERR_NOENTITY. */
|
||||||
int pa_format_info_get_channel_map(pa_format_info *f, pa_channel_map *map);
|
int pa_format_info_get_channel_map(pa_format_info *f, pa_channel_map *map);
|
||||||
|
|
||||||
|
/* Convert a sample spec and an optional channel map to a new PCM format info
|
||||||
|
* object (remember to free it). If map is NULL, then the channel map will be
|
||||||
|
* left unspecified. If some fields of the sample spec should be ignored, pass
|
||||||
|
* false for set_format, set_rate and set_channels as appropriate, then those
|
||||||
|
* fields will be left unspecified. This function returns NULL if the input is
|
||||||
|
* invalid (for example, setting the sample rate was requested, but the rate
|
||||||
|
* in ss is invalid).
|
||||||
|
*
|
||||||
|
* pa_format_info_from_sample_spec() exists too. This "version 2" was created,
|
||||||
|
* because the original function doesn't provide the possibility of ignoring
|
||||||
|
* some of the sample spec fields. That functionality can't be added to the
|
||||||
|
* original function, because the function is a part of the public API and
|
||||||
|
* adding parameters to it would break the API. */
|
||||||
|
pa_format_info *pa_format_info_from_sample_spec2(const pa_sample_spec *ss, const pa_channel_map *map, bool set_format,
|
||||||
|
bool set_rate, bool set_channels);
|
||||||
|
|
||||||
/* Convert the format info into a sample spec and a channel map. If the format
|
/* Convert the format info into a sample spec and a channel map. If the format
|
||||||
* info doesn't contain some information, the fallback sample spec and channel
|
* info doesn't contain some information, the fallback sample spec and channel
|
||||||
* map are used to populate the output.
|
* map are used to populate the output.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue