mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
json: add helper function to parse channel positions
Use the helper instead of duplicating the same code. Also add some helpers to parse a json array of uint32_t Move some functions to convert between type name and id.
This commit is contained in:
parent
911a601b95
commit
e2991f6398
34 changed files with 256 additions and 791 deletions
|
|
@ -159,7 +159,7 @@ static int alsa_set_param(struct state *state, const char *k, const char *s)
|
|||
state->default_rate = atoi(s);
|
||||
fmt_change++;
|
||||
} else if (spa_streq(k, SPA_KEY_AUDIO_FORMAT)) {
|
||||
state->default_format = spa_alsa_format_from_name(s, strlen(s));
|
||||
state->default_format = spa_type_audio_format_from_short_name(s);
|
||||
fmt_change++;
|
||||
} else if (spa_streq(k, SPA_KEY_AUDIO_POSITION)) {
|
||||
spa_alsa_parse_position(&state->default_pos, s, strlen(s));
|
||||
|
|
@ -2041,7 +2041,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
|
|||
unsigned aes3;
|
||||
|
||||
spa_log_info(state->log, "using IEC958 Codec:%s rate:%d",
|
||||
spa_debug_type_find_short_name(spa_type_audio_iec958_codec, f->codec),
|
||||
spa_type_audio_iec958_codec_to_short_name(f->codec),
|
||||
f->rate);
|
||||
|
||||
rformat = SND_PCM_FORMAT_S16_LE;
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ extern "C" {
|
|||
#include <spa/param/param.h>
|
||||
#include <spa/param/latency-utils.h>
|
||||
#include <spa/param/audio/format-utils.h>
|
||||
#include <spa/param/audio/raw-json.h>
|
||||
#include <spa/param/tag-utils.h>
|
||||
|
||||
#include "alsa.h"
|
||||
|
|
@ -303,64 +304,19 @@ void spa_alsa_recycle_buffer(struct state *state, uint32_t buffer_id);
|
|||
void spa_alsa_emit_node_info(struct state *state, bool full);
|
||||
void spa_alsa_emit_port_info(struct state *state, bool full);
|
||||
|
||||
static inline uint32_t spa_alsa_format_from_name(const char *name, size_t len)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; spa_type_audio_format[i].name; i++) {
|
||||
if (strncmp(name, spa_debug_type_short_name(spa_type_audio_format[i].name), len) == 0)
|
||||
return spa_type_audio_format[i].type;
|
||||
}
|
||||
return SPA_AUDIO_FORMAT_UNKNOWN;
|
||||
}
|
||||
|
||||
static inline uint32_t spa_alsa_channel_from_name(const char *name)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; spa_type_audio_channel[i].name; i++) {
|
||||
if (strcmp(name, spa_debug_type_short_name(spa_type_audio_channel[i].name)) == 0)
|
||||
return spa_type_audio_channel[i].type;
|
||||
}
|
||||
return SPA_AUDIO_CHANNEL_UNKNOWN;
|
||||
}
|
||||
|
||||
static inline void spa_alsa_parse_position(struct channel_map *map, const char *val, size_t len)
|
||||
{
|
||||
struct spa_json it[1];
|
||||
char v[256];
|
||||
|
||||
if (spa_json_begin_array_relax(&it[0], val, len) <= 0)
|
||||
return;
|
||||
|
||||
map->channels = 0;
|
||||
while (spa_json_get_string(&it[0], v, sizeof(v)) > 0 &&
|
||||
map->channels < SPA_AUDIO_MAX_CHANNELS) {
|
||||
map->pos[map->channels++] = spa_alsa_channel_from_name(v);
|
||||
}
|
||||
spa_audio_parse_position(val, len, map->pos, &map->channels);
|
||||
}
|
||||
|
||||
static inline uint32_t spa_alsa_parse_rates(uint32_t *rates, uint32_t max, const char *val, size_t len)
|
||||
{
|
||||
struct spa_json it[1];
|
||||
char v[256];
|
||||
uint32_t count;
|
||||
|
||||
if (spa_json_begin_array_relax(&it[0], val, len) <= 0)
|
||||
return 0;
|
||||
|
||||
count = 0;
|
||||
while (spa_json_get_string(&it[0], v, sizeof(v)) > 0 && count < max)
|
||||
rates[count++] = atoi(v);
|
||||
return count;
|
||||
return spa_json_str_array_uint32(val, len, rates, max);
|
||||
}
|
||||
|
||||
static inline uint32_t spa_alsa_iec958_codec_from_name(const char *name)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; spa_type_audio_iec958_codec[i].name; i++) {
|
||||
if (strcmp(name, spa_debug_type_short_name(spa_type_audio_iec958_codec[i].name)) == 0)
|
||||
return spa_type_audio_iec958_codec[i].type;
|
||||
}
|
||||
return SPA_AUDIO_IEC958_CODEC_UNKNOWN;
|
||||
return spa_type_audio_iec958_codec_from_short_name(name);
|
||||
}
|
||||
|
||||
static inline void spa_alsa_parse_iec958_codecs(uint64_t *codecs, const char *val, size_t len)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue