Add EngineDevice class
This commit is contained in:
parent
a1dbbba1a1
commit
315073f9a7
|
@ -59,6 +59,7 @@ set(SOURCES
|
||||||
utilities/screenutils.cpp
|
utilities/screenutils.cpp
|
||||||
|
|
||||||
engine/enginebase.cpp
|
engine/enginebase.cpp
|
||||||
|
engine/enginedevice.cpp
|
||||||
engine/devicefinders.cpp
|
engine/devicefinders.cpp
|
||||||
engine/devicefinder.cpp
|
engine/devicefinder.cpp
|
||||||
engine/enginemetadata.cpp
|
engine/enginemetadata.cpp
|
||||||
|
|
|
@ -28,14 +28,14 @@
|
||||||
|
|
||||||
#include <core/logging.h>
|
#include <core/logging.h>
|
||||||
|
|
||||||
#include "devicefinder.h"
|
|
||||||
#include "alsadevicefinder.h"
|
#include "alsadevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
AlsaDeviceFinder::AlsaDeviceFinder() : DeviceFinder("alsa", { "alsa", "alsasink" }) {}
|
AlsaDeviceFinder::AlsaDeviceFinder() : DeviceFinder("alsa", { "alsa", "alsasink" }) {}
|
||||||
|
|
||||||
DeviceFinder::DeviceList AlsaDeviceFinder::ListDevices() {
|
EngineDeviceList AlsaDeviceFinder::ListDevices() {
|
||||||
|
|
||||||
DeviceList ret;
|
EngineDeviceList devices;
|
||||||
|
|
||||||
snd_pcm_stream_name(SND_PCM_STREAM_PLAYBACK);
|
snd_pcm_stream_name(SND_PCM_STREAM_PLAYBACK);
|
||||||
|
|
||||||
|
@ -91,21 +91,21 @@ DeviceFinder::DeviceList AlsaDeviceFinder::ListDevices() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Device device;
|
EngineDevice device;
|
||||||
device.description = QString("%1 %2").arg(snd_ctl_card_info_get_name(cardinfo), snd_pcm_info_get_name(pcminfo));
|
device.description = QString("%1 %2").arg(snd_ctl_card_info_get_name(cardinfo), snd_pcm_info_get_name(pcminfo));
|
||||||
device.iconname = GuessIconName(device.description);
|
device.iconname = device.GuessIconName();
|
||||||
device.card = card;
|
device.card = card;
|
||||||
device.device = dev;
|
device.device = dev;
|
||||||
|
|
||||||
device.value = QString("hw:%1,%2").arg(card).arg(dev);
|
device.value = QString("hw:%1,%2").arg(card).arg(dev);
|
||||||
ret.append(device);
|
devices.append(device);
|
||||||
device.value = QString("plughw:%1,%2").arg(card).arg(dev);
|
device.value = QString("plughw:%1,%2").arg(card).arg(dev);
|
||||||
ret.append(device);
|
devices.append(device);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
snd_config_update_free_global();
|
snd_config_update_free_global();
|
||||||
|
|
||||||
return ret;
|
return devices;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,13 +23,14 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class AlsaDeviceFinder : public DeviceFinder {
|
class AlsaDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
explicit AlsaDeviceFinder();
|
explicit AlsaDeviceFinder();
|
||||||
|
|
||||||
bool Initialize() override { return true; }
|
bool Initialize() override { return true; }
|
||||||
DeviceList ListDevices() override;
|
EngineDeviceList ListDevices() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(AlsaDeviceFinder)
|
Q_DISABLE_COPY(AlsaDeviceFinder)
|
||||||
|
|
|
@ -25,14 +25,14 @@
|
||||||
|
|
||||||
#include <core/logging.h>
|
#include <core/logging.h>
|
||||||
|
|
||||||
#include "devicefinder.h"
|
|
||||||
#include "alsapcmdevicefinder.h"
|
#include "alsapcmdevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
AlsaPCMDeviceFinder::AlsaPCMDeviceFinder() : DeviceFinder("alsa", { "alsa", "alsasink" }) {}
|
AlsaPCMDeviceFinder::AlsaPCMDeviceFinder() : DeviceFinder("alsa", { "alsa", "alsasink" }) {}
|
||||||
|
|
||||||
DeviceFinder::DeviceList AlsaPCMDeviceFinder::ListDevices() {
|
EngineDeviceList AlsaPCMDeviceFinder::ListDevices() {
|
||||||
|
|
||||||
DeviceList ret;
|
EngineDeviceList ret;
|
||||||
|
|
||||||
void **hints = nullptr;
|
void **hints = nullptr;
|
||||||
if (snd_device_name_hint(-1, "pcm", &hints) < 0) {
|
if (snd_device_name_hint(-1, "pcm", &hints) < 0) {
|
||||||
|
@ -63,10 +63,10 @@ DeviceFinder::DeviceList AlsaPCMDeviceFinder::ListDevices() {
|
||||||
description.append(desc_last);
|
description.append(desc_last);
|
||||||
}
|
}
|
||||||
|
|
||||||
Device device;
|
EngineDevice device;
|
||||||
device.value = name;
|
device.value = name;
|
||||||
device.description = description;
|
device.description = description;
|
||||||
device.iconname = GuessIconName(device.description);
|
device.iconname = device.GuessIconName();
|
||||||
ret << device; // clazy:exclude=reserve-candidates
|
ret << device; // clazy:exclude=reserve-candidates
|
||||||
}
|
}
|
||||||
if (hint_io) free(hint_io);
|
if (hint_io) free(hint_io);
|
||||||
|
|
|
@ -23,13 +23,14 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class AlsaPCMDeviceFinder : public DeviceFinder {
|
class AlsaPCMDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
explicit AlsaPCMDeviceFinder();
|
explicit AlsaPCMDeviceFinder();
|
||||||
|
|
||||||
bool Initialize() override { return true; }
|
bool Initialize() override { return true; }
|
||||||
DeviceList ListDevices() override;
|
EngineDeviceList ListDevices() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(AlsaPCMDeviceFinder)
|
Q_DISABLE_COPY(AlsaPCMDeviceFinder)
|
||||||
|
|
|
@ -24,33 +24,3 @@
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
|
||||||
DeviceFinder::DeviceFinder(const QString &name, const QStringList &outputs) : name_(name), outputs_(outputs) {}
|
DeviceFinder::DeviceFinder(const QString &name, const QStringList &outputs) : name_(name), outputs_(outputs) {}
|
||||||
|
|
||||||
QString DeviceFinder::GuessIconName(const QString &description) {
|
|
||||||
|
|
||||||
QString description_lower = description.toLower();
|
|
||||||
|
|
||||||
if (description_lower.contains("mcintosh")) {
|
|
||||||
return "mcintosh";
|
|
||||||
}
|
|
||||||
if (description_lower.contains("electrocompaniet")) {
|
|
||||||
return "electrocompaniet";
|
|
||||||
}
|
|
||||||
if (description_lower.contains("intel")) {
|
|
||||||
return "intel";
|
|
||||||
}
|
|
||||||
if (description_lower.contains("realtek")) {
|
|
||||||
return "realtek";
|
|
||||||
}
|
|
||||||
if (description_lower.contains("nvidia")) {
|
|
||||||
return "nvidia";
|
|
||||||
}
|
|
||||||
if (description_lower.contains("headset")) {
|
|
||||||
return "headset";
|
|
||||||
}
|
|
||||||
if (description_lower.contains("pulseaudio")) {
|
|
||||||
return "pulseaudio";
|
|
||||||
}
|
|
||||||
|
|
||||||
return "soundcard";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -24,24 +24,13 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <QList>
|
|
||||||
#include <QVariant>
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
// Finds audio output devices
|
// Finds audio output devices
|
||||||
class DeviceFinder {
|
class DeviceFinder {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
struct Device {
|
|
||||||
Device() : card(0), device(0) {}
|
|
||||||
QString description;
|
|
||||||
QVariant value;
|
|
||||||
QString iconname;
|
|
||||||
int card;
|
|
||||||
int device;
|
|
||||||
};
|
|
||||||
using DeviceList = QList<Device>;
|
|
||||||
|
|
||||||
virtual ~DeviceFinder() {}
|
virtual ~DeviceFinder() {}
|
||||||
|
|
||||||
QString name() const { return name_; }
|
QString name() const { return name_; }
|
||||||
|
@ -52,13 +41,11 @@ class DeviceFinder {
|
||||||
virtual bool Initialize() = 0;
|
virtual bool Initialize() = 0;
|
||||||
|
|
||||||
// Returns a list of available devices.
|
// Returns a list of available devices.
|
||||||
virtual DeviceList ListDevices() = 0;
|
virtual EngineDeviceList ListDevices() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit DeviceFinder(const QString &name, const QStringList &outputs);
|
explicit DeviceFinder(const QString &name, const QStringList &outputs);
|
||||||
|
|
||||||
static QString GuessIconName(const QString &description);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString name_;
|
QString name_;
|
||||||
QStringList outputs_;
|
QStringList outputs_;
|
||||||
|
|
|
@ -32,11 +32,12 @@
|
||||||
#include <QUuid>
|
#include <QUuid>
|
||||||
|
|
||||||
#include "directsounddevicefinder.h"
|
#include "directsounddevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
|
||||||
DirectSoundDeviceFinder::DirectSoundDeviceFinder() : DeviceFinder("directsound", { "directsound", "dsound", "directsoundsink", "directx", "directx2" }) {}
|
DirectSoundDeviceFinder::DirectSoundDeviceFinder() : DeviceFinder("directsound", { "directsound", "dsound", "directsoundsink", "directx", "directx2" }) {}
|
||||||
|
|
||||||
DeviceFinder::DeviceList DirectSoundDeviceFinder::ListDevices() {
|
EngineDeviceList DirectSoundDeviceFinder::ListDevices() {
|
||||||
State state;
|
State state;
|
||||||
DirectSoundEnumerateA(&DirectSoundDeviceFinder::EnumerateCallback, &state);
|
DirectSoundEnumerateA(&DirectSoundDeviceFinder::EnumerateCallback, &state);
|
||||||
return state.devices;
|
return state.devices;
|
||||||
|
@ -48,11 +49,11 @@ BOOL CALLBACK DirectSoundDeviceFinder::EnumerateCallback(LPGUID guid, LPCSTR des
|
||||||
|
|
||||||
State *state = reinterpret_cast<State*>(state_voidptr);
|
State *state = reinterpret_cast<State*>(state_voidptr);
|
||||||
|
|
||||||
Device dev;
|
EngineDevice device;
|
||||||
dev.description = QString::fromLatin1(description);
|
device.description = QString::fromLatin1(description);
|
||||||
if (guid) dev.value = QUuid(*guid).toString();
|
if (guid) device.value = QUuid(*guid).toString();
|
||||||
dev.iconname = GuessIconName(dev.description);
|
device.iconname = device.GuessIconName();
|
||||||
state->devices.append(dev);
|
state->devices.append(device);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
|
@ -27,17 +27,18 @@
|
||||||
#include <rpc.h>
|
#include <rpc.h>
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class DirectSoundDeviceFinder : public DeviceFinder {
|
class DirectSoundDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
explicit DirectSoundDeviceFinder();
|
explicit DirectSoundDeviceFinder();
|
||||||
|
|
||||||
virtual bool Initialize() { return true; }
|
virtual bool Initialize() { return true; }
|
||||||
virtual DeviceList ListDevices();
|
virtual EngineDeviceList ListDevices();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct State {
|
struct State {
|
||||||
DeviceList devices;
|
EngineDeviceList devices;
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL CALLBACK EnumerateCallback(LPGUID guid, LPCSTR description, LPCSTR module, LPVOID state_voidptr);
|
static BOOL CALLBACK EnumerateCallback(LPGUID guid, LPCSTR description, LPCSTR module, LPVOID state_voidptr);
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Strawberry Music Player
|
||||||
|
* Copyright 2021-2023, Jonas Kvinge <jonas@jkvinge.net>
|
||||||
|
*
|
||||||
|
* Strawberry is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Strawberry is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
|
EngineDevice::EngineDevice() : card(0), device(0) {}
|
||||||
|
|
||||||
|
QString EngineDevice::GuessIconName() const {
|
||||||
|
|
||||||
|
if (description.contains("mcintosh", Qt::CaseInsensitive)) {
|
||||||
|
return "mcintosh";
|
||||||
|
}
|
||||||
|
if (description.contains("electrocompaniet", Qt::CaseInsensitive)) {
|
||||||
|
return "electrocompaniet";
|
||||||
|
}
|
||||||
|
if (description.contains("intel", Qt::CaseInsensitive)) {
|
||||||
|
return "intel";
|
||||||
|
}
|
||||||
|
if (description.contains("realtek", Qt::CaseInsensitive)) {
|
||||||
|
return "realtek";
|
||||||
|
}
|
||||||
|
if (description.contains("nvidia", Qt::CaseInsensitive)) {
|
||||||
|
return "nvidia";
|
||||||
|
}
|
||||||
|
if (description.contains("headset", Qt::CaseInsensitive)) {
|
||||||
|
return "headset";
|
||||||
|
}
|
||||||
|
if (description.contains("pulseaudio", Qt::CaseInsensitive)) {
|
||||||
|
return "pulseaudio";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "soundcard";
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Strawberry Music Player
|
||||||
|
* Copyright 2021-2023, Jonas Kvinge <jonas@jkvinge.net>
|
||||||
|
*
|
||||||
|
* Strawberry is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Strawberry is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ENGINEDEVICE_H
|
||||||
|
#define ENGINEDEVICE_H
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
|
#include <QVariant>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class EngineDevice {
|
||||||
|
public:
|
||||||
|
explicit EngineDevice();
|
||||||
|
QString GuessIconName() const;
|
||||||
|
QString description;
|
||||||
|
QVariant value;
|
||||||
|
QString iconname;
|
||||||
|
int card;
|
||||||
|
int device;
|
||||||
|
};
|
||||||
|
using EngineDeviceList = QList<EngineDevice>;
|
||||||
|
|
||||||
|
#endif // ENGINEDEVICE_H
|
|
@ -30,6 +30,7 @@
|
||||||
#include "core/scoped_cftyperef.h"
|
#include "core/scoped_cftyperef.h"
|
||||||
|
|
||||||
#include "macosdevicefinder.h"
|
#include "macosdevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -63,9 +64,7 @@ std::unique_ptr<T> GetProperty(const AudioDeviceID &device_id, const AudioObject
|
||||||
|
|
||||||
MacOsDeviceFinder::MacOsDeviceFinder() : DeviceFinder("osxaudio", { "osxaudio", "osx", "osxaudiosink" }) {}
|
MacOsDeviceFinder::MacOsDeviceFinder() : DeviceFinder("osxaudio", { "osxaudio", "osx", "osxaudiosink" }) {}
|
||||||
|
|
||||||
DeviceFinder::DeviceList MacOsDeviceFinder::ListDevices() {
|
EngineDeviceList MacOsDeviceFinder::ListDevices() {
|
||||||
|
|
||||||
DeviceList ret;
|
|
||||||
|
|
||||||
AudioObjectPropertyAddress address = {
|
AudioObjectPropertyAddress address = {
|
||||||
kAudioHardwarePropertyDevices,
|
kAudioHardwarePropertyDevices,
|
||||||
|
@ -76,11 +75,12 @@ DeviceFinder::DeviceList MacOsDeviceFinder::ListDevices() {
|
||||||
UInt32 device_size_bytes = 0;
|
UInt32 device_size_bytes = 0;
|
||||||
std::unique_ptr<AudioDeviceID> devices = GetProperty<AudioDeviceID>(kAudioObjectSystemObject, address, &device_size_bytes);
|
std::unique_ptr<AudioDeviceID> devices = GetProperty<AudioDeviceID>(kAudioObjectSystemObject, address, &device_size_bytes);
|
||||||
if (!devices) {
|
if (!devices) {
|
||||||
return ret;
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
const UInt32 device_count = device_size_bytes / sizeof(AudioDeviceID);
|
const UInt32 device_count = device_size_bytes / sizeof(AudioDeviceID);
|
||||||
|
|
||||||
address.mScope = kAudioDevicePropertyScopeOutput;
|
address.mScope = kAudioDevicePropertyScopeOutput;
|
||||||
|
EngineDeviceList device_list;
|
||||||
for (UInt32 i = 0; i < device_count; ++i) {
|
for (UInt32 i = 0; i < device_count; ++i) {
|
||||||
const AudioDeviceID id = devices.get()[i];
|
const AudioDeviceID id = devices.get()[i];
|
||||||
|
|
||||||
|
@ -99,14 +99,15 @@ DeviceFinder::DeviceList MacOsDeviceFinder::ListDevices() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Device dev;
|
EngineDevice device;
|
||||||
dev.value = id;
|
device.value = id;
|
||||||
dev.description = QString::fromUtf8(CFStringGetCStringPtr(*device_name, CFStringGetSystemEncoding()));
|
device.description = QString::fromUtf8(CFStringGetCStringPtr(*device_name, CFStringGetSystemEncoding()));
|
||||||
if (dev.description.isEmpty()) dev.description = QString("Unknown device " + dev.value.toString());
|
if (device.description.isEmpty()) device.description = QString("Unknown device " + device.value.toString());
|
||||||
dev.iconname = GuessIconName(dev.description);
|
device.iconname = device.GuessIconName();
|
||||||
ret.append(dev);
|
device_list.append(device);
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
return device_list;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,13 +24,14 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class MacOsDeviceFinder : public DeviceFinder {
|
class MacOsDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
explicit MacOsDeviceFinder();
|
explicit MacOsDeviceFinder();
|
||||||
|
|
||||||
virtual bool Initialize() { return true; }
|
virtual bool Initialize() { return true; }
|
||||||
virtual DeviceList ListDevices();
|
virtual EngineDeviceList ListDevices();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MACOSDEVICEFINDER_H
|
#endif // MACOSDEVICEFINDER_H
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include "mmdevicefinder.h"
|
#include "mmdevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -42,14 +43,14 @@
|
||||||
|
|
||||||
MMDeviceFinder::MMDeviceFinder() : DeviceFinder("mmdevice", { "wasapisink" }) {}
|
MMDeviceFinder::MMDeviceFinder() : DeviceFinder("mmdevice", { "wasapisink" }) {}
|
||||||
|
|
||||||
DeviceFinder::DeviceList MMDeviceFinder::ListDevices() {
|
EngineDeviceList MMDeviceFinder::ListDevices() {
|
||||||
|
|
||||||
HRESULT hr_coinit = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
HRESULT hr_coinit = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
||||||
|
|
||||||
DeviceList devices;
|
EngineDeviceList devices;
|
||||||
Device default_device;
|
EngineDevice default_device;
|
||||||
default_device.description = "Default device";
|
default_device.description = "Default device";
|
||||||
default_device.iconname = GuessIconName(default_device.description);
|
default_device.iconname = default_device.GuessIconName();
|
||||||
devices.append(default_device);
|
devices.append(default_device);
|
||||||
|
|
||||||
IMMDeviceEnumerator *enumerator = nullptr;
|
IMMDeviceEnumerator *enumerator = nullptr;
|
||||||
|
@ -75,9 +76,9 @@ DeviceFinder::DeviceList MMDeviceFinder::ListDevices() {
|
||||||
PropVariantInit(&var_name);
|
PropVariantInit(&var_name);
|
||||||
hr = props->GetValue(PKEY_Device_FriendlyName, &var_name);
|
hr = props->GetValue(PKEY_Device_FriendlyName, &var_name);
|
||||||
if (hr == S_OK) {
|
if (hr == S_OK) {
|
||||||
Device device;
|
EngineDevice device;
|
||||||
device.description = QString::fromWCharArray(var_name.pwszVal);
|
device.description = QString::fromWCharArray(var_name.pwszVal);
|
||||||
device.iconname = GuessIconName(device.description);
|
device.iconname = device.GuessIconName();
|
||||||
device.value = QString::fromStdWString(pwszid);
|
device.value = QString::fromStdWString(pwszid);
|
||||||
devices.append(device);
|
devices.append(device);
|
||||||
PropVariantClear(&var_name);
|
PropVariantClear(&var_name);
|
||||||
|
|
|
@ -23,13 +23,14 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class MMDeviceFinder : public DeviceFinder {
|
class MMDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
explicit MMDeviceFinder();
|
explicit MMDeviceFinder();
|
||||||
|
|
||||||
virtual bool Initialize() { return true; }
|
virtual bool Initialize() { return true; }
|
||||||
virtual DeviceList ListDevices();
|
virtual EngineDeviceList ListDevices();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MMDEVICEFINDER_H
|
#endif // MMDEVICEFINDER_H
|
||||||
|
|
|
@ -30,8 +30,8 @@
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
#include "devicefinder.h"
|
|
||||||
#include "pulsedevicefinder.h"
|
#include "pulsedevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
PulseDeviceFinder::PulseDeviceFinder() : DeviceFinder("pulseaudio", { "pulseaudio", "pulse", "pulsesink" }), mainloop_(nullptr), context_(nullptr) {}
|
PulseDeviceFinder::PulseDeviceFinder() : DeviceFinder("pulseaudio", { "pulseaudio", "pulse", "pulsesink" }), mainloop_(nullptr), context_(nullptr) {}
|
||||||
|
|
||||||
|
@ -80,10 +80,10 @@ bool PulseDeviceFinder::Reconnect() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceFinder::DeviceList PulseDeviceFinder::ListDevices() {
|
EngineDeviceList PulseDeviceFinder::ListDevices() {
|
||||||
|
|
||||||
if (!context_ || pa_context_get_state(context_) != PA_CONTEXT_READY) {
|
if (!context_ || pa_context_get_state(context_) != PA_CONTEXT_READY) {
|
||||||
return DeviceList();
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
|
@ -121,12 +121,12 @@ void PulseDeviceFinder::GetSinkInfoCallback(pa_context *c, const pa_sink_info *i
|
||||||
if (!state) return;
|
if (!state) return;
|
||||||
|
|
||||||
if (info) {
|
if (info) {
|
||||||
Device dev;
|
EngineDevice device;
|
||||||
dev.description = QString::fromUtf8(info->description);
|
device.description = QString::fromUtf8(info->description);
|
||||||
dev.value = QString::fromUtf8(info->name);
|
device.value = QString::fromUtf8(info->name);
|
||||||
dev.iconname = GuessIconName(dev.description);
|
device.iconname = device.GuessIconName();
|
||||||
|
|
||||||
state->devices.append(dev);
|
state->devices.append(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eol > 0) {
|
if (eol > 0) {
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <pulse/mainloop.h>
|
#include <pulse/mainloop.h>
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class PulseDeviceFinder : public DeviceFinder {
|
class PulseDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
|
@ -35,14 +36,14 @@ class PulseDeviceFinder : public DeviceFinder {
|
||||||
~PulseDeviceFinder() override;
|
~PulseDeviceFinder() override;
|
||||||
|
|
||||||
bool Initialize() override;
|
bool Initialize() override;
|
||||||
DeviceList ListDevices() override;
|
EngineDeviceList ListDevices() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct ListDevicesState {
|
struct ListDevicesState {
|
||||||
ListDevicesState() : finished(false) {}
|
ListDevicesState() : finished(false) {}
|
||||||
|
|
||||||
bool finished;
|
bool finished;
|
||||||
DeviceList devices;
|
EngineDeviceList devices;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool Reconnect();
|
bool Reconnect();
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "AsyncOperations.h"
|
#include "AsyncOperations.h"
|
||||||
|
|
||||||
#include "uwpdevicefinder.h"
|
#include "uwpdevicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
|
|
||||||
using namespace Microsoft::WRL;
|
using namespace Microsoft::WRL;
|
||||||
|
@ -69,45 +70,45 @@ static std::string hstring_to_stdstring(HString *hstr) {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
DeviceFinder::DeviceList UWPDeviceFinder::ListDevices() {
|
EngineDeviceList UWPDeviceFinder::ListDevices() {
|
||||||
|
|
||||||
ComPtr<IDeviceInformationStatics> device_info_statics;
|
ComPtr<IDeviceInformationStatics> device_info_statics;
|
||||||
HRESULT hr = ABI::Windows::Foundation::GetActivationFactory(HStringReference(RuntimeClass_Windows_Devices_Enumeration_DeviceInformation).Get(), &device_info_statics);
|
HRESULT hr = ABI::Windows::Foundation::GetActivationFactory(HStringReference(RuntimeClass_Windows_Devices_Enumeration_DeviceInformation).Get(), &device_info_statics);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
return DeviceList();
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IAsyncOperation<DeviceInformationCollection*>> async_op;
|
ComPtr<IAsyncOperation<DeviceInformationCollection*>> async_op;
|
||||||
hr = device_info_statics->FindAllAsyncDeviceClass(DeviceClass::DeviceClass_AudioRender, &async_op);
|
hr = device_info_statics->FindAllAsyncDeviceClass(DeviceClass::DeviceClass_AudioRender, &async_op);
|
||||||
device_info_statics.Reset();
|
device_info_statics.Reset();
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
return DeviceList();
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = SyncWait<DeviceInformationCollection*>(async_op.Get());
|
hr = SyncWait<DeviceInformationCollection*>(async_op.Get());
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
return DeviceList();
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
|
|
||||||
ComPtr<IVectorView<DeviceInformation*>> device_list;
|
ComPtr<IVectorView<DeviceInformation*>> device_list;
|
||||||
hr = async_op->GetResults(&device_list);
|
hr = async_op->GetResults(&device_list);
|
||||||
async_op.Reset();
|
async_op.Reset();
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
return DeviceList();
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
hr = device_list->get_Size(&count);
|
hr = device_list->get_Size(&count);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
return DeviceList();
|
return EngineDeviceList();
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceList devices;
|
EngineDeviceList devices;
|
||||||
|
|
||||||
{
|
{
|
||||||
Device default_device;
|
EngineDevice default_device;
|
||||||
default_device.description = "Default device";
|
default_device.description = "Default device";
|
||||||
default_device.iconname = GuessIconName(default_device.description);
|
default_device.iconname = default_device.GuessIconName();
|
||||||
devices.append(default_device);
|
devices.append(default_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,10 +138,10 @@ DeviceFinder::DeviceList UWPDeviceFinder::ListDevices() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Device device;
|
EngineDevice device;
|
||||||
device.value = QString::fromStdString(hstring_to_stdstring(&id));
|
device.value = QString::fromStdString(hstring_to_stdstring(&id));
|
||||||
device.description = QString::fromStdString(hstring_to_stdstring(&name));
|
device.description = QString::fromStdString(hstring_to_stdstring(&name));
|
||||||
device.iconname = GuessIconName(device.description);
|
device.iconname = device.GuessIconName();
|
||||||
devices.append(device);
|
devices.append(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "devicefinder.h"
|
#include "devicefinder.h"
|
||||||
|
#include "enginedevice.h"
|
||||||
|
|
||||||
class UWPDeviceFinder : public DeviceFinder {
|
class UWPDeviceFinder : public DeviceFinder {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "core/player.h"
|
#include "core/player.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
#include "engine/enginebase.h"
|
#include "engine/enginebase.h"
|
||||||
|
#include "engine/enginedevice.h"
|
||||||
#include "engine/devicefinders.h"
|
#include "engine/devicefinders.h"
|
||||||
#include "engine/devicefinder.h"
|
#include "engine/devicefinder.h"
|
||||||
#include "widgets/lineedit.h"
|
#include "widgets/lineedit.h"
|
||||||
|
@ -320,7 +321,7 @@ void BackendSettingsPage::Load_Device(const QString &output, const QVariant &dev
|
||||||
if (!EngineInitialized()) return;
|
if (!EngineInitialized()) return;
|
||||||
|
|
||||||
int devices = 0;
|
int devices = 0;
|
||||||
DeviceFinder::Device df_device;
|
EngineDevice df_device;
|
||||||
|
|
||||||
ui_->combobox_device->clear();
|
ui_->combobox_device->clear();
|
||||||
ui_->lineedit_device->clear();
|
ui_->lineedit_device->clear();
|
||||||
|
@ -332,7 +333,7 @@ void BackendSettingsPage::Load_Device(const QString &output, const QVariant &dev
|
||||||
|
|
||||||
for (DeviceFinder *f : dialog()->app()->device_finders()->ListFinders()) {
|
for (DeviceFinder *f : dialog()->app()->device_finders()->ListFinders()) {
|
||||||
if (!f->outputs().contains(output)) continue;
|
if (!f->outputs().contains(output)) continue;
|
||||||
for (const DeviceFinder::Device &d : f->ListDevices()) {
|
for (const EngineDevice &d : f->ListDevices()) {
|
||||||
devices++;
|
devices++;
|
||||||
ui_->combobox_device->addItem(IconLoader::Load(d.iconname), d.description, d.value);
|
ui_->combobox_device->addItem(IconLoader::Load(d.iconname), d.description, d.value);
|
||||||
if (d.value == device) { df_device = d; }
|
if (d.value == device) { df_device = d; }
|
||||||
|
|
Loading…
Reference in New Issue