On Wed, 2013-08-07 at 23:26 +0530, Arun Raghavan wrote: > Add new PlaybackRate/CaptureRate values for UCM that can be used to > specify custom rates for devices. This value can either be set on the > verb, which makes it apply to all devices, or on the device to override > the verb setting. > --- > src/modules/alsa/alsa-ucm.c | 29 +++++++++++++++++++++++++++-- > src/modules/alsa/alsa-ucm.h | 9 +++++++++ > 2 files changed, 36 insertions(+), 2 deletions(-) > > diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c > index 7f6b9f1..787dc9e 100644 > --- a/src/modules/alsa/alsa-ucm.c > +++ b/src/modules/alsa/alsa-ucm.c > @@ -84,10 +84,12 @@ static struct ucm_items item[] = { > {"PlaybackVolume", PA_ALSA_PROP_UCM_PLAYBACK_VOLUME}, > {"PlaybackSwitch", PA_ALSA_PROP_UCM_PLAYBACK_SWITCH}, > {"PlaybackPriority", PA_ALSA_PROP_UCM_PLAYBACK_PRIORITY}, > + {"PlaybackRate", PA_ALSA_PROP_UCM_PLAYBACK_RATE}, > {"PlaybackChannels", PA_ALSA_PROP_UCM_PLAYBACK_CHANNELS}, > {"CaptureVolume", PA_ALSA_PROP_UCM_CAPTURE_VOLUME}, > {"CaptureSwitch", PA_ALSA_PROP_UCM_CAPTURE_SWITCH}, > {"CapturePriority", PA_ALSA_PROP_UCM_CAPTURE_PRIORITY}, > + {"CaptureRate", PA_ALSA_PROP_UCM_CAPTURE_RATE}, Are these UCM Value items standardized? > {"CaptureChannels", PA_ALSA_PROP_UCM_CAPTURE_CHANNELS}, > {"TQ", PA_ALSA_PROP_UCM_QOS}, > {NULL, NULL}, > @@ -256,8 +258,18 @@ static int ucm_get_device_property( > device->capture_channels = 2; > } > > - /* get priority of device */ > + /* get rate and priority of device */ > if (device->playback_channels) { /* sink device */ > + /* get rate */ > + if ((value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_PLAYBACK_RATE)) || > + (value = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_PLAYBACK_RATE))) { > + if (pa_atou(value, &ui) == 0 && ui < PA_RATE_MAX) { I don't think 0 should be accepted as a valid rate. > + pa_log_debug("UCM playback device %s rate %d", device_name, ui); > + device->playback_rate = ui; > + } else > + pa_log_debug("UCM playback device %s has bad rate %s", device_name, value); > + } > + > value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_PLAYBACK_PRIORITY); > if (value) { > /* get priority from ucm config */ > @@ -269,6 +281,16 @@ static int ucm_get_device_property( > } > > if (device->capture_channels) { /* source device */ > + /* get rate */ > + if ((value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_CAPTURE_RATE)) || > + (value = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_CAPTURE_RATE))) { > + if (pa_atou(value, &ui) == 0 && ui < PA_RATE_MAX) { > + pa_log_debug("UCM playback device %s rate %d", device_name, ui); Copy-paste error here... > + device->capture_rate = ui; > + } else > + pa_log_debug("UCM playback device %s has bad rate %s", device_name, value); ...and here. -- Tanu