Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Knur[SOLVED] Access to source code ?
#1
Hello,

I did not find links or information to get access to the source code of this project.
I understand that some parts may not be open source (author's choice), but the linux kernels patches/modifications should be, as per the GPL license of the linux kernel...
Can someone point me in the right direction ? I'm specifically looking for the RT / native DSD kernel patches and/or configuration.

Many thanks
Reply

#2
(23-May-2019, 05:02 PM)Knur Wrote: Hello,

I did not find links or information to get access to the source code of this project.
I understand that some parts may not be open source (author's choice), but the linux kernels patches/modifications should be, as per the GPL license of the linux kernel...
Can someone point me in the right direction ? I'm specifically looking for the RT / native DSD kernel patches and/or configuration.

Many thanks
Yes, the kernel patch is open sourced. Just not revisioned on a public repo. When my grand plans of a new cloud server to handle user kernel compile requests comes to fruition, it'd be revisioned there.

Until then, here's the current patch. Note only the DSD kernel will apply this patch. Everything else is stock. For this to work, the USB module has to be compiled as a dynamic kernel module. That may or may not be ideal so it'll be something to improve on down the road. The idea is to devise a way for user to dynamically change the native DSD capability by power cycling the DAC (rather than reboot the PC).
Code:
--- linux-4.4.9-rt17/sound/usb/endpoint.c       2017-07-23 12:01:47.000000000 +0800
+++ linux-4.4.9-rt17.dsd/sound/usb/endpoint.c   2019-01-28 10:53:17.063781183 +0800
@@ -634,7 +634,21 @@

        ep->datainterval = fmt->datainterval;
        ep->stride = frame_bits >> 3;
-       ep->silence_value = pcm_format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0;
+
+       switch (pcm_format) {
+       case SNDRV_PCM_FORMAT_U8:
+         ep->silence_value = 0x80;
+         break;
+       case SNDRV_PCM_FORMAT_DSD_U8:
+       case SNDRV_PCM_FORMAT_DSD_U16_LE:
+       case SNDRV_PCM_FORMAT_DSD_U32_LE:
+       case SNDRV_PCM_FORMAT_DSD_U16_BE:
+       case SNDRV_PCM_FORMAT_DSD_U32_BE:
+         ep->silence_value = 0x69;
+         break;
+       default:
+         ep->silence_value = 0;
+       }

        /* assume max. frequency is 25% higher than nominal */
        ep->freqmax = ep->freqn + (ep->freqn >> 2);
--- linux-4.4.9-rt17/sound/usb/quirks.c 2017-07-23 12:01:47.000000000 +0800
+++ linux-4.4.9-rt17.dsd/sound/usb/quirks.c     2019-04-16 12:35:57.865416343 +0800
@@ -19,6 +19,10 @@
 #include <linux/usb.h>
 #include <linux/usb/audio.h>
 #include <linux/usb/midi.h>
+#include <linux/fs.h>
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+#include <linux/buffer_head.h>

 #include <sound/control.h>
 #include <sound/core.h>
@@ -1152,6 +1156,7 @@
 static bool is_marantz_denon_dac(unsigned int id)
 {
        switch (id) {
+       case USB_ID(0x0644, 0x8043): /* Snakeoil: TEAC UD-501 */
        case USB_ID(0x154e, 0x1003): /* Denon DA-300USB */
        case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */
        case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */
@@ -1265,6 +1270,29 @@
                mdelay(1);
 }

+short toDec(const char x)
+{
+  switch (x) {
+    case '0': return 0;
+    case '1': return 1;
+    case '2': return 2;
+    case '3': return 3;
+    case '4': return 4;
+    case '5': return 5;
+    case '6': return 6;
+    case '7': return 7;
+    case '8': return 8;
+    case '9': return 9;
+    case 'a': return 10;
+    case 'b': return 11;
+    case 'c': return 12;
+    case 'd': return 13;
+    case 'e': return 14;
+    case 'f': return 15;
+  }
+  return 0;
+}
+
 /*
  * snd_usb_interface_dsd_format_quirks() is called from format.c to
  * augment the PCM format bit-field for DSD types. The UAC standards
@@ -1276,6 +1304,73 @@
                                        struct audioformat *fp,
                                        unsigned int sample_bytes)
 {
+  char dsdConfig[256];
+  size_t dsdRetVal = 0;
+  struct file * filp = NULL;
+  int loop = 0;
+  unsigned short usb_1 = 0;
+  unsigned short usb_2 = 0;
+  int altset           = 0;
+  u64 dsdFormat        = 0;
+
+  filp = filp_open("/var/www/config/dsd_config", 0, 0);
+  if (IS_ERR(filp)) {
+    printk(KERN_INFO "@Snakeoil DSD Config file not found. Waiting...\n");
+  }
+  else
+  {
+    dsdRetVal = kernel_read(filp, 0, (void*)dsdConfig, 256);
+
+    if (dsdRetVal) {
+     char * ch;
+     //262a-9227-2-DSD_U8
+     //0123456789-1234567
+     if (dsdRetVal < 19) {
+       if (fp->altsetting == 1)
+         printk(KERN_INFO "@Snakeoil DSD Config file size is too small: %ld.\n", dsdRetVal);
+     } else if (!(dsdConfig[4] == ':' && dsdConfig[9] == '-' && dsdConfig[11] == '-' &&
+                 strncmp(&dsdConfig[12], "DSD_U", 5) == 0)) {
+       if (fp->altsetting == 1)
+         printk(KERN_INFO "@Snakeoil DSD Config file appears to be corrupted.\n");
+     } else {
+       dsdConfig[dsdRetVal-1] = '\0';
+       if (fp->altsetting == 1)
+         printk(KERN_INFO "@Snakeoil DSD Config string: (%s)\n", dsdConfig);
+       ch = dsdConfig;
+       usb_1  = (toDec(dsdConfig[0]) << 12) + (toDec(dsdConfig[1]) << 8) +
+                (toDec(dsdConfig[2]) << 4 ) + toDec(dsdConfig[3]);
+       usb_2  = (toDec(dsdConfig[5]) << 12) + (toDec(dsdConfig[6]) << 8) +
+                (toDec(dsdConfig[7]) << 4 ) + toDec(dsdConfig[8]);
+       altset = toDec(dsdConfig[10]);
+       ch = dsdConfig+17;
+       dsdFormat = (*ch == '8')? SNDRV_PCM_FMTBIT_DSD_U8
+                               : (strncmp(ch, "16_LE", 5) == 0)
+                               ? SNDRV_PCM_FMTBIT_DSD_U16_LE
+                               : (strncmp(ch, "32_LE", 5) == 0)
+                               ? SNDRV_PCM_FMTBIT_DSD_U32_LE
+                               : (strncmp(ch, "16_BE", 5) == 0)
+                               ? SNDRV_PCM_FMTBIT_DSD_U16_BE
+                               : SNDRV_PCM_FMTBIT_DSD_U32_BE; // force this as default
+
+       if (chip->usb_id == USB_ID(usb_1, usb_2) && fp->altsetting == altset) {
+         printk(KERN_INFO "@Snakeoil USB_ID: %x:%x Altset: %d NativeDSD: (%s)\n", usb_1, usb_2, fp->altsetting,
+             (dsdFormat == SNDRV_PCM_FMTBIT_DSD_U8? "DSD_U8":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U16_LE? "DSD_U16_LE":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U32_LE? "DSD_U32_LE":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U16_BE? "DSD_U16_BE":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U32_BE? "DSD_U32_BE": "ERROR"));
+
+        return dsdFormat;
+       } else {
+          printk(KERN_INFO "@Snakeoil USB_ID: %x:%x Altset: %d NativeDSD: (None)\n", usb_1, usb_2, fp->altsetting);
+       }
+      }
+    }
+    else if (fp->altsetting == 1) {
+      printk(KERN_INFO "@Snakeoil No Custom DSD Format defined\n");
+    }
+  }
+
        /* Playback Designs */
        if (le16_to_cpu(chip->dev->descriptor.idVendor) == 0x23ba) {
                switch (fp->altsetting) {
@@ -1293,19 +1388,27 @@

        /* XMOS based USB DACs */
        switch (chip->usb_id) {
+  case USB_ID(0x16d0, 0x078c): /* Rockna Audio WaveDream */
+  case USB_ID(0x20b1, 0x2004): /* Matrix Audio X-SPDIF 2 */
        case USB_ID(0x20b1, 0x3008): /* iFi Audio micro/nano iDSD */
        case USB_ID(0x20b1, 0x2008): /* Matrix Audio X-Sabre */
        case USB_ID(0x20b1, 0x300a): /* Matrix Audio Mini-i Pro */
        case USB_ID(0x22d9, 0x0416): /* OPPO HA-1 */
+  case USB_ID(0x22d9, 0x0436): /* OPPO Sonica */
+  case USB_ID(0x16d0, 0x071a): /* Amanero Combo384 */
                if (fp->altsetting == 2)
                        return SNDRV_PCM_FMTBIT_DSD_U32_BE;
                break;
-
        case USB_ID(0x20b1, 0x000a): /* Gustard DAC-X20U */
        case USB_ID(0x20b1, 0x2009): /* DIYINHK DSD DXD 384kHz USB to I2S/DSD */
        case USB_ID(0x20b1, 0x2023): /* JLsounds I2SoverUSB */
        case USB_ID(0x20b1, 0x3023): /* Aune X1S 32BIT/384 DSD DAC */
        case USB_ID(0x2616, 0x0106): /* PS Audio NuWave DAC */
+       case USB_ID(0x20b1, 0x0002): /* Snakeoil: Molamola */
+  case USB_ID(0x20b1, 0x3089): /* Snakeoil: Molamola new firmware */
+  case USB_ID(0x20b1, 0x3036): /* HOLO DAC */
+       case USB_ID(0x20b0, 0x000a): /* Snakeoil: xDuoo XD-05 */
+  case USB_ID(0x20b1, 0x30c6): /* https://www.snakeoil-os.net/forums/Thread-Native-DSD-support-for-new-DAC */
                if (fp->altsetting == 3)
                        return SNDRV_PCM_FMTBIT_DSD_U32_BE;
                break;

To make Snakeoil even better we need more people to look deeper into the kernel code, as well as trying various options. Keeping this a secret is going against that grain. Eventually I'll gather enough Snakeoil supporters to fund up a server, then I have to write the system to make it easy for people to get their kernels.. The idea is:
An audiophile will
  1. Go to a URL
  2. Specify the kernel version he wants
  3. Specify if this is for an upgrade kernel or an install kernel
  4. Specify what CPU/NIC/etc they have
  5. Specify other options, e.g. bridging, tunneling, IPv6, IO schedulers
  6. Enter email, click submit
  7. Request Goes to queue
  8. Kernel is built
  9. Email sent to user to download. If the request is an install kernel, there is an option to download the ISO
  10. Download link will expire after X days of inactivity.
  11. Until then, folks can download the pre-compiled kernels to experiment.
  12. Configuration will be saved and called upon by everybody JIC.
And I strongly believe this will bring Snakeoil to another a level.

The backend will be gitlab (and runners) and nextcloud (file hosting). I will code up a frontend to link it all together. In reality this isn't hard to code.  Alas if only I am doing this full time. Rolleyes
Snakeoil Operating System - Music, your way!
[-] The following 3 users Like agent_kith's post:
  • metronet, Snoopy8, hkphantomgtr
Reply

#3
(23-May-2019, 06:09 PM)agent_kith Wrote:
(23-May-2019, 05:02 PM)Knur Wrote: Hello,

I did not find links or information to get access to the source code of this project.
I understand that some parts may not be open source (author's choice), but the linux kernels patches/modifications should be, as per the GPL license of the linux kernel...
Can someone point me in the right direction ? I'm specifically looking for the RT / native DSD kernel patches and/or configuration.

Many thanks
Yes, the kernel patch is open sourced. Just not revisioned on a public repo. When my grand plans of a new cloud server to handle user kernel compile requests comes to fruition, it'd be revisioned there.

Until then, here's the current patch. Note only the DSD kernel will apply this patch. Everything else is stock. For this to work, the USB module has to be compiled as a dynamic kernel module. That may or may not be ideal so it'll be something to improve on down the road. The idea is to devise a way for user to dynamically change the native DSD capability by power cycling the DAC (rather than reboot the PC).
Code:
--- linux-4.4.9-rt17/sound/usb/endpoint.c       2017-07-23 12:01:47.000000000 +0800
+++ linux-4.4.9-rt17.dsd/sound/usb/endpoint.c   2019-01-28 10:53:17.063781183 +0800
@@ -634,7 +634,21 @@

        ep->datainterval = fmt->datainterval;
        ep->stride = frame_bits >> 3;
-       ep->silence_value = pcm_format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0;
+
+       switch (pcm_format) {
+       case SNDRV_PCM_FORMAT_U8:
+         ep->silence_value = 0x80;
+         break;
+       case SNDRV_PCM_FORMAT_DSD_U8:
+       case SNDRV_PCM_FORMAT_DSD_U16_LE:
+       case SNDRV_PCM_FORMAT_DSD_U32_LE:
+       case SNDRV_PCM_FORMAT_DSD_U16_BE:
+       case SNDRV_PCM_FORMAT_DSD_U32_BE:
+         ep->silence_value = 0x69;
+         break;
+       default:
+         ep->silence_value = 0;
+       }

        /* assume max. frequency is 25% higher than nominal */
        ep->freqmax = ep->freqn + (ep->freqn >> 2);
--- linux-4.4.9-rt17/sound/usb/quirks.c 2017-07-23 12:01:47.000000000 +0800
+++ linux-4.4.9-rt17.dsd/sound/usb/quirks.c     2019-04-16 12:35:57.865416343 +0800
@@ -19,6 +19,10 @@
 #include <linux/usb.h>
 #include <linux/usb/audio.h>
 #include <linux/usb/midi.h>
+#include <linux/fs.h>
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+#include <linux/buffer_head.h>

 #include <sound/control.h>
 #include <sound/core.h>
@@ -1152,6 +1156,7 @@
 static bool is_marantz_denon_dac(unsigned int id)
 {
        switch (id) {
+       case USB_ID(0x0644, 0x8043): /* Snakeoil: TEAC UD-501 */
        case USB_ID(0x154e, 0x1003): /* Denon DA-300USB */
        case USB_ID(0x154e, 0x3005): /* Marantz HD-DAC1 */
        case USB_ID(0x154e, 0x3006): /* Marantz SA-14S1 */
@@ -1265,6 +1270,29 @@
                mdelay(1);
 }

+short toDec(const char x)
+{
+  switch (x) {
+    case '0': return 0;
+    case '1': return 1;
+    case '2': return 2;
+    case '3': return 3;
+    case '4': return 4;
+    case '5': return 5;
+    case '6': return 6;
+    case '7': return 7;
+    case '8': return 8;
+    case '9': return 9;
+    case 'a': return 10;
+    case 'b': return 11;
+    case 'c': return 12;
+    case 'd': return 13;
+    case 'e': return 14;
+    case 'f': return 15;
+  }
+  return 0;
+}
+
 /*
  * snd_usb_interface_dsd_format_quirks() is called from format.c to
  * augment the PCM format bit-field for DSD types. The UAC standards
@@ -1276,6 +1304,73 @@
                                        struct audioformat *fp,
                                        unsigned int sample_bytes)
 {
+  char dsdConfig[256];
+  size_t dsdRetVal = 0;
+  struct file * filp = NULL;
+  int loop = 0;
+  unsigned short usb_1 = 0;
+  unsigned short usb_2 = 0;
+  int altset           = 0;
+  u64 dsdFormat        = 0;
+
+  filp = filp_open("/var/www/config/dsd_config", 0, 0);
+  if (IS_ERR(filp)) {
+    printk(KERN_INFO "@Snakeoil DSD Config file not found. Waiting...\n");
+  }
+  else
+  {
+    dsdRetVal = kernel_read(filp, 0, (void*)dsdConfig, 256);
+
+    if (dsdRetVal) {
+     char * ch;
+     //262a-9227-2-DSD_U8
+     //0123456789-1234567
+     if (dsdRetVal < 19) {
+       if (fp->altsetting == 1)
+         printk(KERN_INFO "@Snakeoil DSD Config file size is too small: %ld.\n", dsdRetVal);
+     } else if (!(dsdConfig[4] == ':' && dsdConfig[9] == '-' && dsdConfig[11] == '-' &&
+                 strncmp(&dsdConfig[12], "DSD_U", 5) == 0)) {
+       if (fp->altsetting == 1)
+         printk(KERN_INFO "@Snakeoil DSD Config file appears to be corrupted.\n");
+     } else {
+       dsdConfig[dsdRetVal-1] = '\0';
+       if (fp->altsetting == 1)
+         printk(KERN_INFO "@Snakeoil DSD Config string: (%s)\n", dsdConfig);
+       ch = dsdConfig;
+       usb_1  = (toDec(dsdConfig[0]) << 12) + (toDec(dsdConfig[1]) << 8) +
+                (toDec(dsdConfig[2]) << 4 ) + toDec(dsdConfig[3]);
+       usb_2  = (toDec(dsdConfig[5]) << 12) + (toDec(dsdConfig[6]) << 8) +
+                (toDec(dsdConfig[7]) << 4 ) + toDec(dsdConfig[8]);
+       altset = toDec(dsdConfig[10]);
+       ch = dsdConfig+17;
+       dsdFormat = (*ch == '8')? SNDRV_PCM_FMTBIT_DSD_U8
+                               : (strncmp(ch, "16_LE", 5) == 0)
+                               ? SNDRV_PCM_FMTBIT_DSD_U16_LE
+                               : (strncmp(ch, "32_LE", 5) == 0)
+                               ? SNDRV_PCM_FMTBIT_DSD_U32_LE
+                               : (strncmp(ch, "16_BE", 5) == 0)
+                               ? SNDRV_PCM_FMTBIT_DSD_U16_BE
+                               : SNDRV_PCM_FMTBIT_DSD_U32_BE; // force this as default
+
+       if (chip->usb_id == USB_ID(usb_1, usb_2) && fp->altsetting == altset) {
+         printk(KERN_INFO "@Snakeoil USB_ID: %x:%x Altset: %d NativeDSD: (%s)\n", usb_1, usb_2, fp->altsetting,
+             (dsdFormat == SNDRV_PCM_FMTBIT_DSD_U8? "DSD_U8":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U16_LE? "DSD_U16_LE":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U32_LE? "DSD_U32_LE":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U16_BE? "DSD_U16_BE":
+             dsdFormat == SNDRV_PCM_FMTBIT_DSD_U32_BE? "DSD_U32_BE": "ERROR"));
+
+        return dsdFormat;
+       } else {
+          printk(KERN_INFO "@Snakeoil USB_ID: %x:%x Altset: %d NativeDSD: (None)\n", usb_1, usb_2, fp->altsetting);
+       }
+      }
+    }
+    else if (fp->altsetting == 1) {
+      printk(KERN_INFO "@Snakeoil No Custom DSD Format defined\n");
+    }
+  }
+
        /* Playback Designs */
        if (le16_to_cpu(chip->dev->descriptor.idVendor) == 0x23ba) {
                switch (fp->altsetting) {
@@ -1293,19 +1388,27 @@

        /* XMOS based USB DACs */
        switch (chip->usb_id) {
+  case USB_ID(0x16d0, 0x078c): /* Rockna Audio WaveDream */
+  case USB_ID(0x20b1, 0x2004): /* Matrix Audio X-SPDIF 2 */
        case USB_ID(0x20b1, 0x3008): /* iFi Audio micro/nano iDSD */
        case USB_ID(0x20b1, 0x2008): /* Matrix Audio X-Sabre */
        case USB_ID(0x20b1, 0x300a): /* Matrix Audio Mini-i Pro */
        case USB_ID(0x22d9, 0x0416): /* OPPO HA-1 */
+  case USB_ID(0x22d9, 0x0436): /* OPPO Sonica */
+  case USB_ID(0x16d0, 0x071a): /* Amanero Combo384 */
                if (fp->altsetting == 2)
                        return SNDRV_PCM_FMTBIT_DSD_U32_BE;
                break;
-
        case USB_ID(0x20b1, 0x000a): /* Gustard DAC-X20U */
        case USB_ID(0x20b1, 0x2009): /* DIYINHK DSD DXD 384kHz USB to I2S/DSD */
        case USB_ID(0x20b1, 0x2023): /* JLsounds I2SoverUSB */
        case USB_ID(0x20b1, 0x3023): /* Aune X1S 32BIT/384 DSD DAC */
        case USB_ID(0x2616, 0x0106): /* PS Audio NuWave DAC */
+       case USB_ID(0x20b1, 0x0002): /* Snakeoil: Molamola */
+  case USB_ID(0x20b1, 0x3089): /* Snakeoil: Molamola new firmware */
+  case USB_ID(0x20b1, 0x3036): /* HOLO DAC */
+       case USB_ID(0x20b0, 0x000a): /* Snakeoil: xDuoo XD-05 */
+  case USB_ID(0x20b1, 0x30c6): /* https://www.snakeoil-os.net/forums/Thread-Native-DSD-support-for-new-DAC */
                if (fp->altsetting == 3)
                        return SNDRV_PCM_FMTBIT_DSD_U32_BE;
                break;

To make Snakeoil even better we need more people to look deeper into the kernel code, as well as trying various options. Keeping this a secret is going against that grain. Eventually I'll gather enough Snakeoil supporters to fund up a server, then I have to write the system to make it easy for people to get their kernels.. The idea is:
An audiophile will
  1. Go to a URL
  2. Specify the kernel version he wants
  3. Specify if this is for an upgrade kernel or an install kernel
  4. Specify what CPU/NIC/etc they have
  5. Specify other options, e.g. bridging, tunneling, IPv6, IO schedulers
  6. Enter email, click submit
  7. Request Goes to queue
  8. Kernel is built
  9. Email sent to user to download. If the request is an install kernel, there is an option to download the ISO
  10. Download link will expire after X days of inactivity.
  11. Until then, folks can download the pre-compiled kernels to experiment.
  12. Configuration will be saved and called upon by everybody JIC.
And I strongly believe this will bring Snakeoil to another a level.

The backend will be gitlab (and runners) and nextcloud (file hosting). I will code up a frontend to link it all together. In reality this isn't hard to code.  Alas if only I am doing this full time. Rolleyes 

SALUTE!!!
[-] The following 1 user Likes hkphantomgtr's post:
  • agent_kith
Reply



Bookmarks

Possibly Related Threads…
Thread Author Replies Views Last Post
  About activation code sunnylof123 2 62 21-Sep-2022, 02:22 PM
Last Post: sunnylof123
  Still cannot access beta releases pathetic 4 97 02-Feb-2022, 09:55 PM
Last Post: pathetic
  [SOLVEDBeta Versions --cannot access pathetic 8 179 01-Feb-2022, 10:39 AM
Last Post: pathetic
  Unable to access Wiki from Android Phone Snoopy8 8 387 02-May-2021, 02:36 PM
Last Post: Snoopy8
  Snakeoil Gear Isolation Alpha Series - Unable to access Web Interface musicnut23 10 955 22-Apr-2021, 07:16 PM
Last Post: musicnut23



Users browsing this thread:
1 Guest(s)

[-]
Our Sponsors

[-]
Welcome
You have to register before you can post on our site.

Username/Email:


Password:





[-]
Latest Threads
Kernel Builder Updates
Last Post: agent_kith
Yesterday 03:43 PM
» Replies: 18
» Views: 512
Snakeoil Firmware - 1.2.8 (Gear Isolatio...
Last Post: hossamyazeed
Yesterday 03:31 PM
» Replies: 14
» Views: 748
LMS not able to play MP3
Last Post: agent_kith
Yesterday 08:52 AM
» Replies: 17
» Views: 138
Desktop environment
Last Post: agent_kith
Yesterday 08:47 AM
» Replies: 4
» Views: 40
[split] Cannot install Roon Bridge
Last Post: agent_kith
Yesterday 08:44 AM
» Replies: 1
» Views: 6
Horror Dashboard
Last Post: pommede
29-Nov-2022 04:32 PM
» Replies: 17
» Views: 255
Roonserver/Hqplayer do not install
Last Post: Tecko
27-Nov-2022 06:09 PM
» Replies: 4
» Views: 43
dsd output music player
Last Post: Snoopy8
26-Nov-2022 04:15 AM
» Replies: 3
» Views: 35
Diretta protocol
Last Post: Evach
21-Nov-2022 08:12 PM
» Replies: 2
» Views: 57
LMS song lyrics plugin
Last Post: Snoopy8
21-Nov-2022 05:51 AM
» Replies: 1
» Views: 14

[-]
SnakeoilOS Mission Statement

Our mission is to create a free to use computer OS that is easy to install, intuitive to operate and play music that will connect and engage with you emotionally.

SnakeoilOS gives you the freedom to spend more time on listening, enjoying and exploring music. Wasting time on computers is now a thing of the past! Everything is constantly evolving/improving. Please check back often for updates.

If you like this project, do show your support with a small token donation. All donations collected will be used to run this website, and for purchasing new equipment for the project.


Powered By MyBB, © 2002-2022 Melroy van den Berg.