diff --git a/spa/plugins/alsa/alsa-pcm-sink.c b/spa/plugins/alsa/alsa-pcm-sink.c index f6acb3fdc..6f0afaf3a 100644 --- a/spa/plugins/alsa/alsa-pcm-sink.c +++ b/spa/plugins/alsa/alsa-pcm-sink.c @@ -51,6 +51,7 @@ static void reset_props(struct props *props) strncpy(props->device, default_device, 64); props->min_latency = default_min_latency; props->max_latency = default_max_latency; + props->use_chmap = DEFAULT_USE_CHMAP; } static int impl_node_enum_params(void *object, int seq, @@ -115,6 +116,13 @@ static int impl_node_enum_params(void *object, int seq, SPA_PROP_INFO_name, SPA_POD_String("The maximum latency"), SPA_PROP_INFO_type, SPA_POD_CHOICE_RANGE_Int(p->max_latency, 1, INT32_MAX)); break; + case 5: + param = spa_pod_builder_add_object(&b, + SPA_TYPE_OBJECT_PropInfo, id, + SPA_PROP_INFO_id, SPA_POD_Id(SPA_PROP_START_CUSTOM), + SPA_PROP_INFO_name, SPA_POD_String("Use the driver channelmap"), + SPA_PROP_INFO_type, SPA_POD_Bool(p->use_chmap)); + break; default: return 0; } @@ -128,11 +136,12 @@ static int impl_node_enum_params(void *object, int seq, case 0: param = spa_pod_builder_add_object(&b, SPA_TYPE_OBJECT_Props, id, - SPA_PROP_device, SPA_POD_Stringn(p->device, sizeof(p->device)), - SPA_PROP_deviceName, SPA_POD_Stringn(p->device_name, sizeof(p->device_name)), - SPA_PROP_cardName, SPA_POD_Stringn(p->card_name, sizeof(p->card_name)), - SPA_PROP_minLatency, SPA_POD_Int(p->min_latency), - SPA_PROP_maxLatency, SPA_POD_Int(p->max_latency)); + SPA_PROP_device, SPA_POD_Stringn(p->device, sizeof(p->device)), + SPA_PROP_deviceName, SPA_POD_Stringn(p->device_name, sizeof(p->device_name)), + SPA_PROP_cardName, SPA_POD_Stringn(p->card_name, sizeof(p->card_name)), + SPA_PROP_minLatency, SPA_POD_Int(p->min_latency), + SPA_PROP_maxLatency, SPA_POD_Int(p->max_latency), + SPA_PROP_START_CUSTOM, SPA_POD_Bool(p->use_chmap)); break; default: return 0; @@ -210,9 +219,10 @@ static int impl_node_set_param(void *object, uint32_t id, uint32_t flags, } spa_pod_parse_object(param, SPA_TYPE_OBJECT_Props, NULL, - SPA_PROP_device, SPA_POD_OPT_Stringn(p->device, sizeof(p->device)), - SPA_PROP_minLatency, SPA_POD_OPT_Int(&p->min_latency), - SPA_PROP_maxLatency, SPA_POD_OPT_Int(&p->max_latency)); + SPA_PROP_device, SPA_POD_OPT_Stringn(p->device, sizeof(p->device)), + SPA_PROP_minLatency, SPA_POD_OPT_Int(&p->min_latency), + SPA_PROP_maxLatency, SPA_POD_OPT_Int(&p->max_latency), + SPA_PROP_START_CUSTOM, SPA_POD_OPT_Bool(&p->use_chmap)); } else return -ENOENT; diff --git a/spa/plugins/alsa/alsa-pcm-source.c b/spa/plugins/alsa/alsa-pcm-source.c index 6bb244e35..06077f642 100644 --- a/spa/plugins/alsa/alsa-pcm-source.c +++ b/spa/plugins/alsa/alsa-pcm-source.c @@ -51,6 +51,7 @@ static void reset_props(struct props *props) strncpy(props->device, default_device, 64); props->min_latency = default_min_latency; props->max_latency = default_max_latency; + props->use_chmap = DEFAULT_USE_CHMAP; } static int impl_node_enum_params(void *object, int seq, @@ -115,6 +116,13 @@ static int impl_node_enum_params(void *object, int seq, SPA_PROP_INFO_name, SPA_POD_String("The maximum latency"), SPA_PROP_INFO_type, SPA_POD_CHOICE_RANGE_Int(p->max_latency, 1, INT32_MAX)); break; + case 5: + param = spa_pod_builder_add_object(&b, + SPA_TYPE_OBJECT_PropInfo, id, + SPA_PROP_INFO_id, SPA_POD_Id(SPA_PROP_START_CUSTOM), + SPA_PROP_INFO_name, SPA_POD_String("Use the driver channelmap"), + SPA_PROP_INFO_type, SPA_POD_Bool(p->use_chmap)); + break; default: return 0; } @@ -125,11 +133,12 @@ static int impl_node_enum_params(void *object, int seq, case 0: param = spa_pod_builder_add_object(&b, SPA_TYPE_OBJECT_Props, id, - SPA_PROP_device, SPA_POD_Stringn(p->device, sizeof(p->device)), - SPA_PROP_deviceName, SPA_POD_Stringn(p->device_name, sizeof(p->device_name)), - SPA_PROP_cardName, SPA_POD_Stringn(p->card_name, sizeof(p->card_name)), - SPA_PROP_minLatency, SPA_POD_Int(p->min_latency), - SPA_PROP_maxLatency, SPA_POD_Int(p->max_latency)); + SPA_PROP_device, SPA_POD_Stringn(p->device, sizeof(p->device)), + SPA_PROP_deviceName, SPA_POD_Stringn(p->device_name, sizeof(p->device_name)), + SPA_PROP_cardName, SPA_POD_Stringn(p->card_name, sizeof(p->card_name)), + SPA_PROP_minLatency, SPA_POD_Int(p->min_latency), + SPA_PROP_maxLatency, SPA_POD_Int(p->max_latency), + SPA_PROP_START_CUSTOM, SPA_POD_Bool(p->use_chmap)); break; default: return 0; @@ -210,9 +219,10 @@ static int impl_node_set_param(void *object, uint32_t id, uint32_t flags, } spa_pod_parse_object(param, SPA_TYPE_OBJECT_Props, NULL, - SPA_PROP_device, SPA_POD_OPT_Stringn(p->device, sizeof(p->device)), - SPA_PROP_minLatency, SPA_POD_OPT_Int(&p->min_latency), - SPA_PROP_maxLatency, SPA_POD_OPT_Int(&p->max_latency)); + SPA_PROP_device, SPA_POD_OPT_Stringn(p->device, sizeof(p->device)), + SPA_PROP_minLatency, SPA_POD_OPT_Int(&p->min_latency), + SPA_PROP_maxLatency, SPA_POD_OPT_Int(&p->max_latency), + SPA_PROP_START_CUSTOM, SPA_POD_OPT_Bool(&p->use_chmap)); break; } default: diff --git a/spa/plugins/alsa/alsa-pcm.c b/spa/plugins/alsa/alsa-pcm.c index 7b0f90cda..932244e7c 100644 --- a/spa/plugins/alsa/alsa-pcm.c +++ b/spa/plugins/alsa/alsa-pcm.c @@ -369,7 +369,7 @@ spa_alsa_enum_format(struct state *state, int seq, uint32_t start, uint32_t num, spa_pod_builder_prop(&b, SPA_FORMAT_AUDIO_channels, 0); - if ((maps = snd_pcm_query_chmaps(hndl)) != NULL) { + if (state->props.use_chmap && (maps = snd_pcm_query_chmaps(hndl)) != NULL) { uint32_t channel; snd_pcm_chmap_t* map; diff --git a/spa/plugins/alsa/alsa-pcm.h b/spa/plugins/alsa/alsa-pcm.h index 6a89ebd22..6f8499e25 100644 --- a/spa/plugins/alsa/alsa-pcm.h +++ b/spa/plugins/alsa/alsa-pcm.h @@ -50,6 +50,7 @@ extern "C" { #define DEFAULT_RATE 48000u #define DEFAULT_CHANNELS 2u +#define DEFAULT_USE_CHMAP false struct props { char device[64]; @@ -57,6 +58,7 @@ struct props { char card_name[128]; uint32_t min_latency; uint32_t max_latency; + bool use_chmap; }; #define MAX_BUFFERS 32