diff options
author | Arun Raghavan <git@arunraghavan.net> | 2016-01-04 12:16:01 +0530 |
---|---|---|
committer | Arun Raghavan <git@arunraghavan.net> | 2016-02-12 19:34:58 +0530 |
commit | cf503f956071895b6e1d467afdc1e10382d60c87 (patch) | |
tree | c87504cb29bd61eef029ffa2bfbecee2d83c99a6 | |
parent | 3314dc72eaef16a5dc909387b2bb21bbcc4efdc2 (diff) |
coreaudio: Dynamically allocate C string when converting from CFString
-rw-r--r-- | src/modules/macosx/module-coreaudio-device.c | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c index 0c92d4293..aa299a0a3 100644 --- a/src/modules/macosx/module-coreaudio-device.c +++ b/src/modules/macosx/module-coreaudio-device.c @@ -376,23 +376,25 @@ static int ca_sink_set_state(pa_sink *s, pa_sink_state_t state) { } /* Caveat: The caller is responsible to get rid of the CFString(Ref). */ -static bool CFString_to_cstr_n(CFStringRef cfstr, char *buf, long n) { - bool ret; - - pa_assert (buf); +static char * CFString_to_cstr(CFStringRef cfstr) { + char *ret = NULL; ret = false; if (cfstr != NULL) { const char *tmp = CFStringGetCStringPtr(cfstr, kCFStringEncodingUTF8); + CFIndex n = CFStringGetLength(cfstr) + 1 /* for the terminating NULL */; + + ret = pa_xmalloc(n); if (tmp == NULL) { - if (CFStringGetCString(cfstr, buf, n, kCFStringEncodingUTF8)) - ret = true; + if (!CFStringGetCString(cfstr, ret, n, kCFStringEncodingUTF8)) { + pa_xfree(ret); + ret = NULL; + } } else { - strncpy(buf, tmp, n); - buf[n - 1] = 0; - ret = true; + strncpy(ret, tmp, n - 1); + ret[n - 1] = '\0'; } } @@ -408,7 +410,7 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx coreaudio_sink *ca_sink; pa_sink *sink; unsigned int i; - char tmp[255]; + char *tmp; pa_strbuf *strbuf; AudioObjectPropertyAddress property_address; CFStringRef tmp_cfstr = NULL; @@ -425,23 +427,24 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx property_address.mSelector = kAudioObjectPropertyElementName; property_address.mScope = kAudioDevicePropertyScopeOutput; property_address.mElement = channel_idx + i + 1; - size = sizeof(tmp); + size = sizeof(tmp_cfstr); 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))); + tmp = CFString_to_cstr(tmp_cfstr); - if (tmp_cfstr) { + if (tmp_cfstr) CFRelease(tmp_cfstr); - } } - if (err || !strlen(tmp)) - snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement); - if (i > 0) pa_strbuf_puts(strbuf, ", "); - pa_strbuf_puts(strbuf, tmp); + if (err || !tmp || !strlen(tmp)) + pa_strbuf_printf(strbuf, "Channel %d", (int) property_address.mElement); + else + pa_strbuf_puts(strbuf, tmp); + + pa_xfree(tmp); } ca_sink->name = pa_strbuf_to_string_free(strbuf); @@ -535,7 +538,7 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i coreaudio_source *ca_source; pa_source *source; unsigned int i; - char tmp[255]; + char *tmp; pa_strbuf *strbuf; AudioObjectPropertyAddress property_address; CFStringRef tmp_cfstr = NULL; @@ -552,23 +555,24 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i property_address.mSelector = kAudioObjectPropertyElementName; property_address.mScope = kAudioDevicePropertyScopeInput; property_address.mElement = channel_idx + i + 1; - size = sizeof(tmp); + size = sizeof(tmp_cfstr); 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))); + tmp = CFString_to_cstr(tmp_cfstr); - if (tmp_cfstr) { + if (tmp_cfstr) CFRelease(tmp_cfstr); - } } - if (err || !strlen(tmp)) - snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement); - if (i > 0) pa_strbuf_puts(strbuf, ", "); - pa_strbuf_puts(strbuf, tmp); + if (err || !tmp || !strlen(tmp)) + pa_strbuf_printf(strbuf, "Channel %d", (int) property_address.mElement); + else + pa_strbuf_puts(strbuf, tmp); + + pa_xfree(tmp); } ca_source->name = pa_strbuf_to_string_free(strbuf); |