Signed-off-by: Mihai Moldovan <ionic at ionic.de> --- src/modules/macosx/module-coreaudio-detect.c | 30 +++++++++++++++++++++++++--- src/modules/macosx/module-coreaudio-device.c | 23 ++++++++++++++++++--- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/modules/macosx/module-coreaudio-detect.c b/src/modules/macosx/module-coreaudio-detect.c index d9c09da..dd558c2 100644 --- a/src/modules/macosx/module-coreaudio-detect.c +++ b/src/modules/macosx/module-coreaudio-detect.c @@ -39,10 +39,14 @@ PA_MODULE_AUTHOR("Daniel Mack"); PA_MODULE_DESCRIPTION("CoreAudio device detection"); PA_MODULE_VERSION(PACKAGE_VERSION); PA_MODULE_LOAD_ONCE(true); -PA_MODULE_USAGE("ioproc_frames=<passed on to module-coreaudio-device> "); +PA_MODULE_USAGE("ioproc_frames=<passed on to module-coreaudio-device> " + "record=<enable source?> " + "playback=<enable sink?> "); static const char* const valid_modargs[] = { "ioproc_frames", + "record", + "playback", NULL }; @@ -58,6 +62,8 @@ struct userdata { int detect_fds[2]; pa_io_event *detect_io; unsigned int ioproc_frames; + bool record; + bool playback; PA_LLIST_HEAD(ca_device, devices); }; @@ -87,9 +93,9 @@ static int ca_device_added(struct pa_module *m, AudioObjectID id) { return 0; if (u->ioproc_frames) - args = pa_sprintf_malloc("object_id=%d ioproc_frames=%d", (int) id, u->ioproc_frames); + args = pa_sprintf_malloc("object_id=%d ioproc_frames=%d record=%d playback=%d", (int) id, u->ioproc_frames, (int) u->record, (int) u->playback); else - args = pa_sprintf_malloc("object_id=%d", (int) id); + args = pa_sprintf_malloc("object_id=%d record=%d playback=%d", (int) id, (int) u->record, (int) u->playback); pa_log_debug("Loading %s with arguments '%s'", DEVICE_MODULE_NAME, args); mod = pa_module_load(m->core, DEVICE_MODULE_NAME, args); @@ -212,6 +218,7 @@ int pa__init(pa_module *m) { pa_modargs *ma; pa_assert(m); + pa_assert(m->core); m->userdata = u; @@ -220,6 +227,23 @@ int pa__init(pa_module *m) { goto fail; } + /* + * Set default value to true if not given as a modarg. + * In such a case, pa_modargs_get_value_boolean() will not touch the + * buffer. + */ + u->playback = u->record = true; + + if (pa_modargs_get_value_boolean(ma, "record", &u->record) < 0 || pa_modargs_get_value_boolean(ma, "playback", &u->playback) < 0) { + pa_log("record= and playback= expect boolean argument."); + goto fail; + } + + if (!u->playback && !u->record) { + pa_log("neither playback nor record enabled for device."); + goto fail; + } + pa_modargs_get_value_u32(ma, "ioproc_frames", &u->ioproc_frames); property_address.mSelector = kAudioHardwarePropertyDevices; diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c index 93f57ed..a292d39 100644 --- a/src/modules/macosx/module-coreaudio-device.c +++ b/src/modules/macosx/module-coreaudio-device.c @@ -58,11 +58,15 @@ PA_MODULE_DESCRIPTION("CoreAudio device"); PA_MODULE_VERSION(PACKAGE_VERSION); PA_MODULE_LOAD_ONCE(false); PA_MODULE_USAGE("object_id=<the CoreAudio device id> " - "ioproc_frames=<audio frames per IOProc call> "); + "ioproc_frames=<audio frames per IOProc call> " + "record=<enable source?> " + "playback=<enable sink?> "); static const char* const valid_modargs[] = { "object_id", "ioproc_frames", + "record", + "playback", NULL }; @@ -772,6 +776,7 @@ int pa__init(pa_module *m) { UInt32 size, frames; struct userdata *u = NULL; pa_modargs *ma = NULL; + bool record = true, playback = true; char tmp[64]; pa_card_new_data card_new_data; pa_card_profile *p; @@ -786,6 +791,16 @@ int pa__init(pa_module *m) { goto fail; } + if (pa_modargs_get_value_boolean(ma, "record", &record) < 0 || pa_modargs_get_value_boolean(ma, "playback", &playback) < 0) { + pa_log("record= and playback= expect boolean argument."); + goto fail; + } + + if (!playback && !record) { + pa_log("neither playback nor record enabled for device."); + goto fail; + } + u = pa_xnew0(struct userdata, 1); u->module = m; m->userdata = u; @@ -845,10 +860,12 @@ int pa__init(pa_module *m) { PA_LLIST_HEAD_INIT(coreaudio_sink, u->sinks); /* create sinks */ - ca_device_create_streams(m, false); + if (playback) + ca_device_create_streams(m, false); /* create sources */ - ca_device_create_streams(m, true); + if (record) + ca_device_create_streams(m, true); /* create the message thread */ if (!(u->thread = pa_thread_new(u->device_name, thread_func, u))) { -- 2.7.1 -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 884 bytes Desc: OpenPGP digital signature URL: <https://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20160211/d373e318/attachment-0001.sig>