summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Raghavan <git@arunraghavan.net>2016-01-04 12:16:01 +0530
committerArun Raghavan <git@arunraghavan.net>2016-02-12 19:34:58 +0530
commitcf503f956071895b6e1d467afdc1e10382d60c87 (patch)
treec87504cb29bd61eef029ffa2bfbecee2d83c99a6
parent3314dc72eaef16a5dc909387b2bb21bbcc4efdc2 (diff)
coreaudio: Dynamically allocate C string when converting from CFString
-rw-r--r--src/modules/macosx/module-coreaudio-device.c58
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);