[pulseaudio-discuss] [PATCH v2] module-coreaudio-device: get channel name as CFString and convert to plain C string.
David Henningsson
david.henningsson at canonical.com
Mon Apr 20 02:33:29 PDT 2015
First, thanks for looking after OSX :-)
And then - could you try sending your patch with git send-email (or git
format-patch and then attach the resulting file)? This looks weird, with
half of the patch in an attachment and the header outside the attachment.
On 2015-04-19 08:57, Mihai Moldovan wrote:
>
> diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c
> index cb62661..ad5c07b 100644
> --- a/src/modules/macosx/module-coreaudio-device.c
> +++ b/src/modules/macosx/module-coreaudio-device.c
> @@ -375,6 +375,39 @@ static int ca_sink_set_state(pa_sink *s, pa_sink_state_t state) {
> return 0;
> }
>
> +/* Caveat: this function frees the CFString if conversion succeeded. */
I'm not actually following the reasoning. Is the CFString leaked if the
conversion fails, that can't be a good thing?
> +static int CFString_to_cstr_n(CFStringRef cfstr, char *buf, long n) {
Maybe return a bool here instead of int? Often an int result of 0 means
success/no error, here's it's the opposite, which is confusing.
> + int ret;
> +
> + assert (buf);
> +
> + ret = 0;
> +
> + if (cfstr != NULL) {
> + const char *tmp = CFStringGetCStringPtr(cfstr, kCFStringEncodingUTF8);
> +
> + if (tmp == NULL) {
> + if (CFStringGetCString(cfstr, buf, n, kCFStringEncodingUTF8))
> + ret = 1;
> + }
> + else {
> + strncpy(buf, tmp, n);
> + buf[n - 1] = 0;
> + ret = 1;
> + }
> + }
> +
> + /*
> + * A true value for ret implies cfstr != NULL, but let's still do the check
> + * for safety reasons (i.e., should this code ever be re-organized...)
> + */
> + if (ret && cfstr != NULL) {
> + CFRelease(cfstr);
> + }
Can't you just move it a line above, inside the "if (cfstr != NULL)"
part? Then you don't need to check for it again.
> +
> + return ret;
> +}
> +
> static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx) {
> OSStatus err;
> UInt32 size;
> @@ -387,6 +420,7 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx
> char tmp[255];
> pa_strbuf *strbuf;
> AudioObjectPropertyAddress property_address;
> + CFStringRef tmp_cfstr;
>
> ca_sink = pa_xnew0(coreaudio_sink, 1);
> ca_sink->map.channels = buf->mNumberChannels;
> @@ -401,7 +435,11 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx
> property_address.mScope = kAudioDevicePropertyScopeOutput;
> property_address.mElement = channel_idx + i + 1;
> size = sizeof(tmp);
> - err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, tmp);
> + err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &tmp_cfstr);
> + if (err == 0) {
> + err = !(CFString_to_cstr_n(tmp_cfstr, tmp, sizeof(tmp)));
> + }
> +
> if (err || !strlen(tmp))
> snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement);
>
> @@ -505,6 +543,7 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i
> char tmp[255];
> pa_strbuf *strbuf;
> AudioObjectPropertyAddress property_address;
> + CFStringRef tmp_cfstr;
>
> ca_source = pa_xnew0(coreaudio_source, 1);
> ca_source->map.channels = buf->mNumberChannels;
> @@ -519,7 +558,11 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i
> property_address.mScope = kAudioDevicePropertyScopeInput;
> property_address.mElement = channel_idx + i + 1;
> size = sizeof(tmp);
> - err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, tmp);
> + err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &tmp_cfstr);
> + if (err == 0) {
> + err = !(CFString_to_cstr_n(tmp_cfstr, tmp, sizeof(tmp)));
> + }
> +
> if (err || !strlen(tmp))
> snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement);
>
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the pulseaudio-discuss
mailing list