diff --git a/daemon/configure.ac b/daemon/configure.ac
index 601cdfb191166f72c8bf0f834bdbb6a40de39c32..0d8f075423e63d60892c2cfc9371533557d61bb9 100644
--- a/daemon/configure.ac
+++ b/daemon/configure.ac
@@ -91,6 +91,11 @@ AM_CONDITIONAL(HAVE_WIN32,   test "${SYS}" = "mingw32")
 AM_CONDITIONAL(HAVE_WIN64,   test "${HAVE_WIN64}" = "1")
 AM_CONDITIONAL(HAVE_OSX,   test "${HAVE_OSX}" = "1")
 
+dnl FIXME this should be deduced automatically
+AC_DEFINE_UNQUOTED([HAVE_COREAUDIO],
+                    `if test "${HAVE_OSX}" = "1"; then echo 1; else echo 0; fi`,
+                    [Define if you have CoreAudio])
+
 dnl Android is linux, but a bit different
 AS_IF([test "$SYS" = linux],[
     AC_MSG_CHECKING([for an Android system])
diff --git a/daemon/src/audio/audiolayer.h b/daemon/src/audio/audiolayer.h
index ec6bd334d3ff0e20d72ead73e82bb12b36ab3ae8..6908c0604f2198342981c6daa9e003d7ec96ce47 100644
--- a/daemon/src/audio/audiolayer.h
+++ b/daemon/src/audio/audiolayer.h
@@ -52,6 +52,7 @@
 #define PULSEAUDIO_API_STR          "pulseaudio"
 #define ALSA_API_STR                "alsa"
 #define JACK_API_STR                "jack"
+#define COREAUDIO_API_STR           "coreaudio"
 
 #define PCM_DEFAULT "default"         // Default ALSA plugin
 #define PCM_DSNOOP  "plug:dsnoop"     // Alsa plugin for microphone sharing
diff --git a/daemon/src/audio/coreaudio/corelayer.cpp b/daemon/src/audio/coreaudio/corelayer.cpp
index 566c6e6a240c7b49d50504b56934d96d8050bde1..1bfed13718ac7371ee7acdbb7965c3a8848f438b 100644
--- a/daemon/src/audio/coreaudio/corelayer.cpp
+++ b/daemon/src/audio/coreaudio/corelayer.cpp
@@ -122,6 +122,17 @@ void CoreLayer::startStream()
         return;
 }
 
+
+int CoreLayer::getAudioDeviceIndex(const std::string& name, DeviceType type) const
+{
+    return 0;
+}
+
+std::string CoreLayer::getAudioDeviceName(int index, DeviceType type) const
+{
+    return "";
+}
+
 void CoreLayer::stopStream()
 {
     isStarted_ = false;
diff --git a/daemon/src/audio/coreaudio/corelayer.h b/daemon/src/audio/coreaudio/corelayer.h
index b095af5fbf4898f1cc7b508f1615dfb1f4bdc2a5..87d2374c21d2b0525d526b11c21f421e4f27f4cb 100644
--- a/daemon/src/audio/coreaudio/corelayer.h
+++ b/daemon/src/audio/coreaudio/corelayer.h
@@ -56,6 +56,9 @@ class CoreLayer : public AudioLayer {
         virtual std::vector<std::string> getCaptureDeviceList() const;
         virtual std::vector<std::string> getPlaybackDeviceList() const;
 
+        virtual int getAudioDeviceIndex(const std::string& name, DeviceType type) const;
+        virtual std::string getAudioDeviceName(int index, DeviceType type) const;
+
         /**
          * Get the index of the audio card for capture
          * @return int The index of the card used for capture
diff --git a/daemon/src/preferences.cpp b/daemon/src/preferences.cpp
index e9be3eb72456a5d89bafb0c69d0c52362cf45beb..28ec334ae70a1a8914692036ecfff5d750604cda 100644
--- a/daemon/src/preferences.cpp
+++ b/daemon/src/preferences.cpp
@@ -47,6 +47,9 @@
 #if HAVE_PULSE
 #include "audio/pulseaudio/pulselayer.h"
 #endif
+#if HAVE_COREAUDIO
+#include "audio/coreaudio/corelayer.h"
+#endif
 #endif /* HAVE_OPENSL */
 
 #include <yaml-cpp/yaml.h>
@@ -380,6 +383,15 @@ sfl::AudioLayer* AudioPreference::createAudioLayer()
     checkSoundCard(alsaCardring_, sfl::DeviceType::RINGTONE);
 
     return new sfl::AlsaLayer(*this);
+#endif
+
+#if HAVE_COREAUDIO
+    audioApi_ = COREAUDIO_API_STR;
+    try {
+        return new sfl::CoreLayer(*this);
+    } catch (const std::runtime_error &e) {
+        SFL_WARN("Could not create coreaudio layer. There will be no sound.");
+    }
 #else
     return NULL;
 #endif