3#include <Audio/AudioInterface.hpp>
5#include <ossia/audio/miniaudio_protocol.hpp>
6#if OSSIA_ENABLE_MINIAUDIO
7#include <Audio/GenericMiniAudioInterface.hpp>
9#include <ossia/audio/libasound.hpp>
15class ALSAMiniAudioFactory final :
public GenericMiniAudioFactory
17 SCORE_CONCRETE(
"e0c533da-a1f4-4795-90b5-a805cdfcb79f")
19 ALSAMiniAudioFactory() { }
20 ~ALSAMiniAudioFactory()
override { }
21 QString prettyName()
const override {
return QObject::tr(
"ALSA (MiniAudio)"); }
22 bool available() const noexcept
override
26 ossia::libasound::instance();
36 compareDeviceId(
const ma_device_id&
id,
const QString& str)
const noexcept override
38 return compareDeviceId(
id, std::string_view{str.toStdString()});
41 compareDeviceId(
const ma_device_id&
id, std::string_view str)
const noexcept override
43 return id.alsa == str ||
id.alsa == stableName(str);
48 ma_share_mode shareMode() const noexcept
override {
return ma_share_mode_exclusive; }
50 void normalizeDeviceId(ma_device_id&
id)
const noexcept override
52 auto name = stableName(
id.alsa);
53 if(!name.empty() && name.size() <
sizeof(
id.alsa))
55 std::fill_n(
id.alsa,
sizeof(
id.alsa), 0);
56 std::copy_n(name.data(), name.size(),
id.alsa);
64 static std::string stableName(std::string_view
id)
66 int card = -1, dev = -1;
67 if(
id.size() < 4 ||
id[0] !=
':' ||
id.find(
"CARD=") != std::string_view::npos
68 || std::sscanf(std::string{
id}.c_str(),
":%d,%d", &card, &dev) != 2)
71 auto& snd = ossia::libasound::instance();
73 if(snd.ctl_open(&ctl, (
"hw:" + std::to_string(card)).c_str(), SND_CTL_NONBLOCK) < 0)
75 snd_ctl_card_info_t* info{};
76 snd_alloca(&info, snd, ctl_card_info);
78 if(snd.ctl_card_info(ctl, info) == 0)
79 res =
":CARD=" + std::string{snd.ctl_card_info_get_id(info)}
80 +
",DEV=" + std::to_string(dev);
84 void setDeviceId(ma_device_id&
id,
const QString& str)
const noexcept override
86 auto u = str.toUtf8();
87 std::fill_n(
id.alsa, 256, 0);
88 std::copy_n(u.data(), std::min((
int)u.size(), 255),
id.alsa);
91 QString deviceIdToString(
const ma_device_id&
id)
const noexcept override
93 return QString::fromUtf8(
id.alsa);