Skip to content

Commit

Permalink
Modify how the device name prefix is handled
Browse files Browse the repository at this point in the history
The backends now only handle the un-prefixed name, leaving the caller to add or
remove the prefix as necessary. This helps ensure more consistent prefixing
without the backend having to be aware, and will eventually allow more
customization of it.
  • Loading branch information
kcat committed Sep 5, 2024
1 parent eb383cc commit 6accc37
Show file tree
Hide file tree
Showing 23 changed files with 143 additions and 146 deletions.
49 changes: 44 additions & 5 deletions alc/alc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,12 @@ BackendFactory *CaptureFactory{};

[[nodiscard]] constexpr auto GetDefaultName() noexcept { return "OpenAL Soft\0"; }

#ifdef _WIN32
[[nodiscard]] constexpr auto GetDevicePrefix() noexcept { return "OpenAL Soft on "sv; }
#else
[[nodiscard]] constexpr auto GetDevicePrefix() noexcept { return std::string_view{}; }
#endif

/************************************************
* Global variables
************************************************/
Expand Down Expand Up @@ -725,6 +731,10 @@ void ProbeAllDevicesList()
else
{
alcAllDevicesArray = PlaybackFactory->enumerate(BackendType::Playback);
if(const auto prefix = GetDevicePrefix(); !prefix.empty())
std::for_each(alcAllDevicesArray.begin(), alcAllDevicesArray.end(),
[prefix](std::string &name) { name.insert(0, prefix); });

decltype(alcAllDevicesList){}.swap(alcAllDevicesList);
if(alcAllDevicesArray.empty())
alcAllDevicesList += '\0';
Expand All @@ -745,6 +755,10 @@ void ProbeCaptureDeviceList()
else
{
alcCaptureDeviceArray = CaptureFactory->enumerate(BackendType::Capture);
if(const auto prefix = GetDevicePrefix(); !prefix.empty())
std::for_each(alcCaptureDeviceArray.begin(), alcCaptureDeviceArray.end(),
[prefix](std::string &name) { name.insert(0, prefix); });

decltype(alcCaptureDeviceList){}.swap(alcCaptureDeviceList);
if(alcCaptureDeviceArray.empty())
alcCaptureDeviceList += '\0';
Expand Down Expand Up @@ -2034,7 +2048,7 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *Device, ALCenum para
else
{
std::lock_guard<std::mutex> statelock{dev->StateLock};
value = dev->DeviceName.c_str();
value = dev->mDeviceName.c_str();
}
}
else
Expand All @@ -2052,7 +2066,7 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *Device, ALCenum para
else
{
std::lock_guard<std::mutex> statelock{dev->StateLock};
value = dev->DeviceName.c_str();
value = dev->mDeviceName.c_str();
}
}
else
Expand Down Expand Up @@ -2912,6 +2926,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) noexcep
|| al::starts_with(devname, "'("sv)
|| al::case_compare(devname, "openal-soft"sv) == 0)
devname = {};
else
{
const auto prefix = GetDevicePrefix();
if(!prefix.empty() && devname.size() > prefix.size()
&& al::starts_with(devname, prefix))
devname = devname.substr(prefix.size());
}
}
else
TRACE("Opening default playback device\n");
Expand Down Expand Up @@ -2948,6 +2969,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) noexcep
auto backend = PlaybackFactory->createBackend(device.get(), BackendType::Playback);
std::lock_guard<std::recursive_mutex> listlock{ListLock};
backend->open(devname);
device->mDeviceName = std::string{GetDevicePrefix()}+backend->mDeviceName;
device->Backend = std::move(backend);
}
catch(al::backend_exception &e) {
Expand Down Expand Up @@ -2984,7 +3006,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) noexcep
DeviceList.emplace(iter, device.get());
}

TRACE("Created device %p, \"%s\"\n", voidp{device.get()}, device->DeviceName.c_str());
TRACE("Created device %p, \"%s\"\n", voidp{device.get()}, device->mDeviceName.c_str());
return device.release();
}

Expand Down Expand Up @@ -3065,6 +3087,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
if(al::case_compare(devname, GetDefaultName()) == 0
|| al::case_compare(devname, "openal-soft"sv) == 0)
devname = {};
else
{
const auto prefix = GetDevicePrefix();
if(!prefix.empty() && devname.size() > prefix.size()
&& al::starts_with(devname, prefix))
devname = devname.substr(prefix.size());
}
}
else
TRACE("Opening default capture device\n");
Expand Down Expand Up @@ -3102,6 +3131,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
auto backend = CaptureFactory->createBackend(device.get(), BackendType::Capture);
std::lock_guard<std::recursive_mutex> listlock{ListLock};
backend->open(devname);
device->mDeviceName = std::string{GetDevicePrefix()}+backend->mDeviceName;
device->Backend = std::move(backend);
}
catch(al::backend_exception &e) {
Expand All @@ -3118,7 +3148,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
}
device->mDeviceState = DeviceState::Configured;

TRACE("Created capture device %p, \"%s\"\n", voidp{device.get()}, device->DeviceName.c_str());
TRACE("Created capture device %p, \"%s\"\n", voidp{device.get()}, device->mDeviceName.c_str());
return device.release();
}

Expand Down Expand Up @@ -3276,6 +3306,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
auto backend = LoopbackBackendFactory::getFactory().createBackend(device.get(),
BackendType::Playback);
backend->open("Loopback");
device->mDeviceName = std::string{GetDevicePrefix()}+backend->mDeviceName;
device->Backend = std::move(backend);
}
catch(al::backend_exception &e) {
Expand Down Expand Up @@ -3487,6 +3518,13 @@ FORCE_ALIGN ALCboolean ALC_APIENTRY alcReopenDeviceSOFT(ALCdevice *device,
}
if(al::case_compare(devname, GetDefaultName()) == 0)
devname = {};
else
{
const auto prefix = GetDevicePrefix();
if(!prefix.empty() && devname.size() > prefix.size()
&& al::starts_with(devname, prefix))
devname = devname.substr(prefix.size());
}
}

/* Force the backend device to stop first since we're opening another one. */
Expand Down Expand Up @@ -3525,9 +3563,10 @@ FORCE_ALIGN ALCboolean ALC_APIENTRY alcReopenDeviceSOFT(ALCdevice *device,
return ALC_FALSE;
}
listlock.unlock();
dev->mDeviceName = std::string{GetDevicePrefix()}+newbackend->mDeviceName;
dev->Backend = std::move(newbackend);
dev->mDeviceState = DeviceState::Unprepared;
TRACE("Reopened device %p, \"%s\"\n", voidp{dev.get()}, dev->DeviceName.c_str());
TRACE("Reopened device %p, \"%s\"\n", voidp{dev.get()}, dev->mDeviceName.c_str());

std::string{}.swap(dev->mVendorOverride);
std::string{}.swap(dev->mVersionOverride);
Expand Down
8 changes: 4 additions & 4 deletions alc/backends/alsa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -709,7 +709,7 @@ void AlsaPlayback::open(std::string_view name)
/* Free alsa's global config tree. Otherwise valgrind reports a ton of leaks. */
snd_config_update_free_global();

mDevice->DeviceName = name;
mDeviceName = name;
}

bool AlsaPlayback::reset()
Expand Down Expand Up @@ -740,7 +740,7 @@ bool AlsaPlayback::reset()
break;
}

bool allowmmap{GetConfigValueBool(mDevice->DeviceName, "alsa"sv, "mmap"sv, true)};
bool allowmmap{GetConfigValueBool(mDevice->mDeviceName, "alsa"sv, "mmap"sv, true)};
uint periodLen{static_cast<uint>(mDevice->UpdateSize * 1000000_u64 / mDevice->Frequency)};
uint bufferLen{static_cast<uint>(mDevice->BufferSize * 1000000_u64 / mDevice->Frequency)};
uint rate{mDevice->Frequency};
Expand Down Expand Up @@ -798,7 +798,7 @@ bool AlsaPlayback::reset()
else mDevice->FmtChans = DevFmtStereo;
}
/* set rate (implicitly constrains period/buffer parameters) */
if(!GetConfigValueBool(mDevice->DeviceName, "alsa", "allow-resampler", false)
if(!GetConfigValueBool(mDevice->mDeviceName, "alsa", "allow-resampler", false)
|| !mDevice->Flags.test(FrequencyRequest))
{
if(snd_pcm_hw_params_set_rate_resample(mPcmHandle, hp.get(), 0) < 0)
Expand Down Expand Up @@ -1038,7 +1038,7 @@ void AlsaCapture::open(std::string_view name)
if(needring)
mRing = RingBuffer::Create(mDevice->BufferSize, mDevice->frameSizeFromFmt(), false);

mDevice->DeviceName = name;
mDeviceName = name;
}


Expand Down
1 change: 1 addition & 0 deletions alc/backends/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ struct BackendBase {
virtual ClockLatency getClockLatency();

DeviceBase *const mDevice;
std::string mDeviceName;

BackendBase() = delete;
BackendBase(const BackendBase&) = delete;
Expand Down
16 changes: 8 additions & 8 deletions alc/backends/coreaudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ void CoreAudioPlayback::open(std::string_view name)

#if CAN_ENUMERATE
if(!name.empty())
mDevice->DeviceName = name;
mDeviceName = name;
else
{
UInt32 propSize{sizeof(audioDevice)};
Expand All @@ -444,8 +444,8 @@ void CoreAudioPlayback::open(std::string_view name)
kAudioUnitScope_Global, OutputElement, &audioDevice, &propSize);

std::string devname{GetDeviceName(audioDevice)};
if(!devname.empty()) mDevice->DeviceName = std::move(devname);
else mDevice->DeviceName = "Unknown Device Name";
if(!devname.empty()) mDeviceName = std::move(devname);
else mDeviceName = "Unknown Device Name";
}

if(audioDevice != kAudioDeviceUnknown)
Expand All @@ -463,7 +463,7 @@ void CoreAudioPlayback::open(std::string_view name)
}

#else
mDevice->DeviceName = name;
mDeviceName = name;
#endif
}

Expand Down Expand Up @@ -885,7 +885,7 @@ void CoreAudioCapture::open(std::string_view name)

#if CAN_ENUMERATE
if(!name.empty())
mDevice->DeviceName = name;
mDeviceName = name;
else
{
UInt32 propSize{sizeof(audioDevice)};
Expand All @@ -894,11 +894,11 @@ void CoreAudioCapture::open(std::string_view name)
kAudioUnitScope_Global, InputElement, &audioDevice, &propSize);

std::string devname{GetDeviceName(audioDevice)};
if(!devname.empty()) mDevice->DeviceName = std::move(devname);
else mDevice->DeviceName = "Unknown Device Name";
if(!devname.empty()) mDeviceName = std::move(devname);
else mDeviceName = "Unknown Device Name";
}
#else
mDevice->DeviceName = name;
mDeviceName = name;
#endif
}

Expand Down
9 changes: 3 additions & 6 deletions alc/backends/dsound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,6 @@ DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0

namespace {

#define DEVNAME_HEAD "OpenAL Soft on "


#ifdef HAVE_DYNLOAD
void *ds_handle;
HRESULT (WINAPI *pDirectSoundCreate)(const GUID *pcGuidDevice, IDirectSound **ppDS, IUnknown *pUnkOuter);
Expand Down Expand Up @@ -146,7 +143,7 @@ BOOL CALLBACK DSoundEnumDevices(GUID *guid, const WCHAR *desc, const WCHAR*, voi
return TRUE;

auto& devices = *static_cast<std::vector<DevMap>*>(data);
const std::string basename{DEVNAME_HEAD + wstr_to_utf8(desc)};
const auto basename = wstr_to_utf8(desc);

int count{1};
std::string newname{basename};
Expand Down Expand Up @@ -356,7 +353,7 @@ void DSoundPlayback::open(std::string_view name)
mPrimaryBuffer = nullptr;
mDS = std::move(ds);

mDevice->DeviceName = name;
mDeviceName = name;
}

bool DSoundPlayback::reset()
Expand Down Expand Up @@ -691,7 +688,7 @@ void DSoundCapture::open(std::string_view name)
mBufferBytes = DSCBDescription.dwBufferBytes;
setDefaultWFXChannelOrder();

mDevice->DeviceName = name;
mDeviceName = name;
}

void DSoundCapture::start()
Expand Down
11 changes: 6 additions & 5 deletions alc/backends/jack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ void JackPlayback::open(std::string_view name)
mPortPattern = iter->mPattern;
}

mDevice->DeviceName = name;
mDeviceName = name;
}

bool JackPlayback::reset()
Expand All @@ -520,7 +520,7 @@ bool JackPlayback::reset()
std::for_each(mPort.begin(), mPort.end(), unregister_port);
mPort.fill(nullptr);

mRTMixing = GetConfigValueBool(mDevice->DeviceName, "jack", "rt-mix", true);
mRTMixing = GetConfigValueBool(mDevice->mDeviceName, "jack", "rt-mix", true);
jack_set_process_callback(mClient,
mRTMixing ? &JackPlayback::processRtC : &JackPlayback::processC, this);

Expand All @@ -538,8 +538,9 @@ bool JackPlayback::reset()
}
else
{
const std::string_view devname{mDevice->DeviceName};
uint bufsize{ConfigValueUInt(devname, "jack", "buffer-size").value_or(mDevice->UpdateSize)};
const auto devname = std::string_view{mDevice->mDeviceName};
auto bufsize = ConfigValueUInt(devname, "jack", "buffer-size")
.value_or(mDevice->UpdateSize);
bufsize = std::max(NextPowerOf2(bufsize), mDevice->UpdateSize);
mDevice->BufferSize = bufsize + mDevice->UpdateSize;
}
Expand Down Expand Up @@ -588,7 +589,7 @@ void JackPlayback::start()
if(jack_activate(mClient))
throw al::backend_exception{al::backend_error::DeviceError, "Failed to activate client"};

const std::string_view devname{mDevice->DeviceName};
const auto devname = std::string_view{mDevice->mDeviceName};
if(ConfigValueBool(devname, "jack", "connect-ports").value_or(true))
{
JackPortsPtr pnames{jack_get_ports(mClient, mPortPattern.c_str(), JACK_DEFAULT_AUDIO_TYPE,
Expand Down
2 changes: 1 addition & 1 deletion alc/backends/loopback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct LoopbackBackend final : public BackendBase {

void LoopbackBackend::open(std::string_view name)
{
mDevice->DeviceName = name;
mDeviceName = name;
}

bool LoopbackBackend::reset()
Expand Down
3 changes: 1 addition & 2 deletions alc/backends/null.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <functional>
#include <thread>

#include "almalloc.h"
#include "alstring.h"
#include "althrd_setname.h"
#include "core/device.h"
Expand Down Expand Up @@ -113,7 +112,7 @@ void NullBackend::open(std::string_view name)
throw al::backend_exception{al::backend_error::NoDevice, "Device name \"%.*s\" not found",
al::sizei(name), name.data()};

mDevice->DeviceName = name;
mDeviceName = name;
}

bool NullBackend::reset()
Expand Down
4 changes: 2 additions & 2 deletions alc/backends/oboe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ void OboePlayback::open(std::string_view name)
throw al::backend_exception{al::backend_error::DeviceError, "Failed to create stream: %s",
oboe::convertToText(result)};

mDevice->DeviceName = name;
mDeviceName = name;
}

bool OboePlayback::reset()
Expand Down Expand Up @@ -315,7 +315,7 @@ void OboeCapture::open(std::string_view name)
mRing = RingBuffer::Create(std::max(mDevice->BufferSize, mDevice->Frequency/10u),
static_cast<uint32_t>(mStream->getBytesPerFrame()), false);

mDevice->DeviceName = name;
mDeviceName = name;
}

void OboeCapture::start()
Expand Down
4 changes: 2 additions & 2 deletions alc/backends/opensl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ void OpenSLPlayback::open(std::string_view name)
"Failed to initialize OpenSL device: 0x%08x", result};
}

mDevice->DeviceName = name;
mDeviceName = name;
}

bool OpenSLPlayback::reset()
Expand Down Expand Up @@ -785,7 +785,7 @@ void OpenSLCapture::open(std::string_view name)
"Failed to initialize OpenSL device: 0x%08x", result};
}

mDevice->DeviceName = name;
mDeviceName = name;
}

void OpenSLCapture::start()
Expand Down
Loading

0 comments on commit 6accc37

Please sign in to comment.