Blame SOURCES/0007-detect-sound-devices.patch

e67e1d
From 1cc52cac74ea735faae92dc963d10292608d7a4d Mon Sep 17 00:00:00 2001
e67e1d
From: Lyonel Vincent <lyonel@ezix.org>
e67e1d
Date: Thu, 2 Apr 2020 13:39:42 +0200
e67e1d
Subject: [PATCH 07/17] detect sound devices
e67e1d
e67e1d
---
e67e1d
 src/core/main.cc  |  4 ++++
e67e1d
 src/core/sound.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++
e67e1d
 src/core/sound.h  |  8 +++++++
e67e1d
 src/core/sysfs.cc |  5 +++++
e67e1d
 src/core/sysfs.h  |  1 +
e67e1d
 5 files changed, 71 insertions(+)
e67e1d
 create mode 100644 src/core/sound.cc
e67e1d
 create mode 100644 src/core/sound.h
e67e1d
e67e1d
diff --git a/src/core/main.cc b/src/core/main.cc
e67e1d
index ad0e586ef549..e35258c56141 100644
e67e1d
--- a/src/core/main.cc
e67e1d
+++ b/src/core/main.cc
e67e1d
@@ -46,6 +46,7 @@
e67e1d
 #include "nvme.h"
e67e1d
 #include "mmc.h"
e67e1d
 #include "input.h"
e67e1d
+#include "sound.h"
e67e1d
 #include "smp.h"
e67e1d
 #include "abi.h"
e67e1d
 #include "s390.h"
e67e1d
@@ -141,6 +142,9 @@ bool scan_system(hwNode & system)
e67e1d
     status("MMC");
e67e1d
     if (enabled("mmc"))
e67e1d
       scan_mmc(computer);
e67e1d
+    status("sound");
e67e1d
+    if (enabled("sound"))
e67e1d
+      scan_sound(computer);
e67e1d
     status("input");
e67e1d
     if (enabled("input"))
e67e1d
       scan_input(computer);
e67e1d
diff --git a/src/core/sound.cc b/src/core/sound.cc
e67e1d
new file mode 100644
e67e1d
index 000000000000..05edf2352267
e67e1d
--- /dev/null
e67e1d
+++ b/src/core/sound.cc
e67e1d
@@ -0,0 +1,53 @@
e67e1d
+#include "version.h"
e67e1d
+#include "hw.h"
e67e1d
+#include "sysfs.h"
e67e1d
+#include "osutils.h"
e67e1d
+#include "sound.h"
e67e1d
+#include "heuristics.h"
e67e1d
+
e67e1d
+#include <vector>
e67e1d
+#include <iostream>
e67e1d
+
e67e1d
+__ID("@(#) $Id$");
e67e1d
+
e67e1d
+using namespace std;
e67e1d
+
e67e1d
+bool scan_sound(hwNode & n)
e67e1d
+{
e67e1d
+  vector < sysfs::entry > entries = sysfs::entries_by_class("sound");
e67e1d
+
e67e1d
+  if (entries.empty())
e67e1d
+    return false;
e67e1d
+
e67e1d
+  for (vector < sysfs::entry >::iterator it = entries.begin();
e67e1d
+      it != entries.end(); ++it)
e67e1d
+  {
e67e1d
+    const sysfs::entry & e = *it;
e67e1d
+    string id = e.string_attr("id");
e67e1d
+    if(id!="")
e67e1d
+    {
e67e1d
+      hwNode *device = n.findChildByBusInfo(e.leaf().businfo());
e67e1d
+      if(!device)
e67e1d
+        device = n.addChild(hwNode("sound", hw::multimedia));
e67e1d
+      device->claim();
e67e1d
+      if(device->getDescription() == "") device->setDescription(id);
e67e1d
+      //device->setPhysId(e.hex_attr("number"));
e67e1d
+      //device->setBusInfo("sound@"+e.string_attr("number"));
e67e1d
+      device->setLogicalName("snd/"+e.name());
e67e1d
+      if(device->getProduct() == "") device->setProduct(e.string_attr("name"));
e67e1d
+      device->setModalias(e.modalias());
e67e1d
+
e67e1d
+      vector < sysfs::entry > events = e.devices();
e67e1d
+      for(vector < sysfs::entry >::iterator i = events.begin(); i != events.end(); ++i)
e67e1d
+      {
e67e1d
+        const sysfs::entry & d = *i;
e67e1d
+	if(d.subsystem() == "sound")
e67e1d
+	{
e67e1d
+          device->setLogicalName("snd/"+d.name());
e67e1d
+	}
e67e1d
+      }
e67e1d
+    }
e67e1d
+  }
e67e1d
+
e67e1d
+  return true;
e67e1d
+}
e67e1d
diff --git a/src/core/sound.h b/src/core/sound.h
e67e1d
new file mode 100644
e67e1d
index 000000000000..c2caf04687bf
e67e1d
--- /dev/null
e67e1d
+++ b/src/core/sound.h
e67e1d
@@ -0,0 +1,8 @@
e67e1d
+#ifndef _SOUND_H_
e67e1d
+#define _SOUND_H_
e67e1d
+
e67e1d
+#include "hw.h"
e67e1d
+
e67e1d
+bool scan_sound(hwNode &);
e67e1d
+
e67e1d
+#endif
e67e1d
diff --git a/src/core/sysfs.cc b/src/core/sysfs.cc
e67e1d
index 32d65642f157..ee8b1da06c78 100644
e67e1d
--- a/src/core/sysfs.cc
e67e1d
+++ b/src/core/sysfs.cc
e67e1d
@@ -343,6 +343,11 @@ string entry::classname() const
e67e1d
   return basename(dirname(This->devpath).c_str());
e67e1d
 }
e67e1d
 
e67e1d
+string entry::subsystem() const
e67e1d
+{
e67e1d
+  return basename(realpath(This->devpath+"/subsystem").c_str());
e67e1d
+}
e67e1d
+
e67e1d
 bool entry::isvirtual() const
e67e1d
 {
e67e1d
   return string(basename(dirname(dirname(This->devpath)).c_str())) == "virtual";
e67e1d
diff --git a/src/core/sysfs.h b/src/core/sysfs.h
e67e1d
index 9cc1b2b0a500..c25430b834df 100644
e67e1d
--- a/src/core/sysfs.h
e67e1d
+++ b/src/core/sysfs.h
e67e1d
@@ -26,6 +26,7 @@ namespace sysfs
e67e1d
       bool hassubdir(const string &) const;
e67e1d
       string name() const;
e67e1d
       string classname() const;
e67e1d
+      string subsystem() const;
e67e1d
       bool isvirtual() const;
e67e1d
       string businfo() const;
e67e1d
       string driver() const;
e67e1d
-- 
e67e1d
2.17.1
e67e1d