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