[pulseaudio-discuss] [PATCH v2] module-coreaudio-{device, detect}: implement record and playback modargs, curtesy of module-waveout.

Mihai Moldovan ionic at ionic.de
Thu Feb 11 02:25:33 UTC 2016


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>


More information about the pulseaudio-discuss mailing list