--- src/modules/macosx/module-coreaudio-detect.c.old	2017-09-18 12:41:02.000000000 +0200
+++ src/modules/macosx/module-coreaudio-detect.c	2017-11-05 12:33:57.000000000 +0100
@@ -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_mod
         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;
--- src/modules/macosx/module-coreaudio-device.c.old	2017-11-05 12:28:30.000000000 +0100
+++ src/modules/macosx/module-coreaudio-device.c	2017-11-05 12:33:57.000000000 +0100
@@ -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
 };
 
@@ -768,6 +772,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;
@@ -782,6 +787,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;
@@ -853,10 +868,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))) {
