--- xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp.orig	2018-04-18 09:37:24 UTC
+++ xbmc/cores/AudioEngine/Sinks/AESinkOSS.cpp
@@ -23,6 +23,7 @@
 #include <limits.h>
 #include <unistd.h>
 
+#include "cores/AudioEngine/AESinkFactory.h"
 #include "cores/AudioEngine/Utils/AEUtil.h"
 #include "utils/log.h"
 #include "threads/SingleLock.h"
@@ -71,6 +72,25 @@ CAESinkOSS::CAESinkOSS()
 CAESinkOSS::~CAESinkOSS()
 {
   Deinitialize();
+}
+
+void CAESinkOSS::Register()
+{
+  AE::AESinkRegEntry entry;
+  entry.sinkName = "OSS";
+  entry.createFunc = CAESinkOSS::Create;
+  entry.enumerateFunc = CAESinkOSS::EnumerateDevicesEx;
+  AE::CAESinkFactory::RegisterSink(entry);
+}
+
+IAESink* CAESinkOSS::Create(std::string &device, AEAudioFormat& desiredFormat)
+{
+  IAESink* sink = new CAESinkOSS();
+  if (sink->Initialize(desiredFormat, device))
+    return sink;
+
+  delete sink;
+  return nullptr;
 }
 
 std::string CAESinkOSS::GetDeviceUse(const AEAudioFormat& format, const std::string &device)
--- xbmc/cores/AudioEngine/Sinks/AESinkOSS.h.orig	2018-04-18 09:37:24 UTC
+++ xbmc/cores/AudioEngine/Sinks/AESinkOSS.h
@@ -33,6 +33,10 @@ class CAESinkOSS : public IAESink (public)
   CAESinkOSS();
   ~CAESinkOSS() override;
 
+  static void Register();
+  static IAESink* Create(std::string &device, AEAudioFormat &desiredFormat);
+  static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false);
+
   bool Initialize(AEAudioFormat &format, std::string &device) override;
   void Deinitialize() override;
 
@@ -41,7 +45,6 @@ class CAESinkOSS : public IAESink (public)
   double GetCacheTotal() override { return 0.0; } /* FIXME */
   unsigned int AddPackets(uint8_t **data, unsigned int frames, unsigned int offset) override;
   void Drain() override;
-  static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false);
 private:
   int m_fd;
   std::string m_device;
--- xbmc/platform/linux/OptionalsReg.cpp.orig	2018-04-18 09:37:24 UTC
+++ xbmc/platform/linux/OptionalsReg.cpp
@@ -58,6 +58,23 @@ bool OPTIONALS::PulseAudioRegister()
 #endif
 
 //-----------------------------------------------------------------------------
+// OSS
+//-----------------------------------------------------------------------------
+#ifdef TARGET_FREEBSD
+#include "cores/AudioEngine/Sinks/AESinkOSS.h"
+bool OPTIONALS::OSSRegister()
+{
+  CAESinkOSS::Register();
+  return false;
+}
+#else
+bool OPTIONALS::OSSRegister()
+{
+  return false;
+}
+#endif
+
+//-----------------------------------------------------------------------------
 // sndio
 //-----------------------------------------------------------------------------
 
--- xbmc/platform/linux/OptionalsReg.h.orig	2018-04-18 09:37:24 UTC
+++ xbmc/platform/linux/OptionalsReg.h
@@ -39,6 +39,15 @@ bool PulseAudioRegister();
 }
 
 //-----------------------------------------------------------------------------
+// OSS
+//-----------------------------------------------------------------------------
+
+namespace OPTIONALS
+{
+bool OSSRegister();
+}
+
+//-----------------------------------------------------------------------------
 // sndio
 //-----------------------------------------------------------------------------
 
--- xbmc/windowing/X11/WinSystemX11GLContext.cpp.orig	2018-04-18 09:37:24 UTC
+++ xbmc/windowing/X11/WinSystemX11GLContext.cpp
@@ -63,6 +63,10 @@ CWinSystemX11GLContext::CWinSystemX11GLContext()
   {
     OPTIONALS::PulseAudioRegister();
   }
+  else if (StringUtils::EqualsNoCase(envSink, "OSS"))
+  {
+    OPTIONALS::OSSRegister();
+  }
   else if (StringUtils::EqualsNoCase(envSink, "SNDIO"))
   {
     OPTIONALS::SndioRegister();
@@ -73,7 +77,10 @@ CWinSystemX11GLContext::CWinSystemX11GLContext()
     {
       if (!OPTIONALS::ALSARegister())
       {
-        OPTIONALS::SndioRegister();
+        if (!OPTIONALS::SndioRegister())
+        {
+          OPTIONALS::OSSRegister();
+        }
       }
     }
   }
--- xbmc/windowing/gbm/WinSystemGbm.cpp.orig	2018-04-18 09:37:24 UTC
+++ xbmc/windowing/gbm/WinSystemGbm.cpp
@@ -54,6 +54,10 @@ CWinSystemGbm::CWinSystemGbm() :
   {
     OPTIONALS::PulseAudioRegister();
   }
+  else if (StringUtils::EqualsNoCase(envSink, "OSS"))
+  {
+    OPTIONALS::OSSRegister();
+  }
   else if (StringUtils::EqualsNoCase(envSink, "SNDIO"))
   {
     OPTIONALS::SndioRegister();
@@ -64,7 +68,10 @@ CWinSystemGbm::CWinSystemGbm() :
     {
       if (!OPTIONALS::ALSARegister())
       {
-        OPTIONALS::SndioRegister();
+        if (!OPTIONALS::SndioRegister())
+        {
+          OPTIONALS::OSSRegister();
+        }
       }
     }
   }
--- xbmc/windowing/wayland/WinSystemWayland.cpp.orig	2018-04-18 09:37:24 UTC
+++ xbmc/windowing/wayland/WinSystemWayland.cpp
@@ -159,6 +159,10 @@ CWinSystemWayland::CWinSystemWayland()
   {
     OPTIONALS::PulseAudioRegister();
   }
+  else if (StringUtils::EqualsNoCase(envSink, "OSS"))
+  {
+    OPTIONALS::OSSRegister();
+  }
   else if (StringUtils::EqualsNoCase(envSink, "SNDIO"))
   {
     OPTIONALS::SndioRegister();
@@ -169,7 +173,10 @@ CWinSystemWayland::CWinSystemWayland()
     {
       if (!OPTIONALS::ALSARegister())
       {
-        OPTIONALS::SndioRegister();
+        if (!OPTIONALS::SndioRegister())
+        {
+          OPTIONALS::OSSRegister();
+        }
       }
     }
   }
