Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added configurable audio #660

Merged
merged 4 commits into from
Aug 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,11 @@ std::shared_ptr<Context> Context::CreateInstance(const std::string name, const s
const std::string configFilePath,
const std::vector<std::string>& otrFiles,
const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount) {
uint32_t reservedThreadCount, AudioSettings audioSettings) {
if (mContext.expired()) {
auto shared = std::make_shared<Context>(name, shortName, configFilePath);
mContext = shared;
shared->Init(otrFiles, validHashes, reservedThreadCount);
shared->Init(otrFiles, validHashes, reservedThreadCount, audioSettings);
return shared;
}

Expand All @@ -75,7 +75,7 @@ Context::Context(std::string name, std::string shortName, std::string configFile
}

void Context::Init(const std::vector<std::string>& otrFiles, const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount) {
uint32_t reservedThreadCount, AudioSettings audioSettings) {
InitLogging();
InitConfiguration();
InitConsoleVariables();
Expand All @@ -84,7 +84,7 @@ void Context::Init(const std::vector<std::string>& otrFiles, const std::unordere
InitCrashHandler();
InitConsole();
InitWindow();
InitAudio();
InitAudio(audioSettings);
InitGfxDebugger();
}

Expand Down Expand Up @@ -227,12 +227,12 @@ void Context::InitCrashHandler() {
mCrashHandler = std::make_shared<CrashHandler>();
}

void Context::InitAudio() {
void Context::InitAudio(AudioSettings settings) {
if (GetAudio() != nullptr) {
return;
}

mAudio = std::make_shared<Audio>();
mAudio = std::make_shared<Audio>(settings);
GetAudio()->Init();
}

Expand Down
6 changes: 3 additions & 3 deletions src/Context.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class Context {
const std::string configFilePath,
const std::vector<std::string>& otrFiles = {},
const std::unordered_set<uint32_t>& validHashes = {},
uint32_t reservedThreadCount = 1);
uint32_t reservedThreadCount = 1, AudioSettings audioSettings = {});
static std::shared_ptr<Context> CreateUninitializedInstance(const std::string name, const std::string shortName,
const std::string configFilePath);
static std::string GetAppBundlePath();
Expand All @@ -38,7 +38,7 @@ class Context {
~Context();

void Init(const std::vector<std::string>& otrFiles, const std::unordered_set<uint32_t>& validHashes,
uint32_t reservedThreadCount);
uint32_t reservedThreadCount, AudioSettings audioSettings);

std::shared_ptr<spdlog::logger> GetLogger();
std::shared_ptr<Config> GetConfig();
Expand All @@ -62,7 +62,7 @@ class Context {
const std::unordered_set<uint32_t>& validHashes = {}, uint32_t reservedThreadCount = 1);
void InitControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks = {});
void InitCrashHandler();
void InitAudio();
void InitAudio(AudioSettings settings);
void InitGfxDebugger();
void InitConsole();
void InitWindow(std::vector<std::shared_ptr<GuiWindow>> guiWindows = {});
Expand Down
8 changes: 3 additions & 5 deletions src/audio/Audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
#include "Context.h"

namespace Ship {
Audio::Audio() {
}

Audio::~Audio() {
SPDLOG_TRACE("destruct audio");
Expand All @@ -14,19 +12,19 @@ void Audio::InitAudioPlayer() {
switch (GetAudioBackend()) {
#ifdef _WIN32
case AudioBackend::WASAPI:
mAudioPlayer = std::make_shared<WasapiAudioPlayer>();
mAudioPlayer = std::make_shared<WasapiAudioPlayer>(this->mAudioSettings);
break;
#endif
default:
mAudioPlayer = std::make_shared<SDLAudioPlayer>();
mAudioPlayer = std::make_shared<SDLAudioPlayer>(this->mAudioSettings);
}

if (mAudioPlayer) {
if (!mAudioPlayer->Init()) {
// Failed to initialize system audio player.
// Fallback to SDL if the native system player does not work.
SetAudioBackend(AudioBackend::SDL);
mAudioPlayer = std::make_shared<SDLAudioPlayer>();
mAudioPlayer = std::make_shared<SDLAudioPlayer>(this->mAudioSettings);
mAudioPlayer->Init();
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/audio/Audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ enum class AudioBackend { WASAPI, SDL };

class Audio {
public:
Audio();
Audio(AudioSettings settings) : mAudioSettings(settings) {
}
~Audio();

void Init();
Expand All @@ -25,6 +26,7 @@ class Audio {
private:
std::shared_ptr<AudioPlayer> mAudioPlayer;
AudioBackend mAudioBackend;
AudioSettings mAudioSettings;
std::shared_ptr<std::vector<AudioBackend>> mAvailableAudioBackends;
};
} // namespace Ship
2 changes: 0 additions & 2 deletions src/audio/AudioPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
#include "spdlog/spdlog.h"

namespace Ship {
AudioPlayer::AudioPlayer() : mInitialized(false){};

AudioPlayer::~AudioPlayer() {
SPDLOG_TRACE("destruct audio player");
}
Expand Down
36 changes: 32 additions & 4 deletions src/audio/AudioPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,56 @@
#include <string>

namespace Ship {

struct AudioSettings {
int SampleRate = 44100;
int SampleLength = 1024;
int DesiredBuffered = 2480;
};

class AudioPlayer {

public:
AudioPlayer();
AudioPlayer(AudioSettings settings) : mAudioSettings(settings) {
}
~AudioPlayer();

bool Init(void);
virtual int Buffered(void) = 0;
virtual int GetDesiredBuffered(void) = 0;
virtual void Play(const uint8_t* buf, size_t len) = 0;

bool IsInitialized(void);

constexpr int GetSampleRate() const {
return 44100;
return this->mAudioSettings.SampleRate;
}

constexpr int GetSampleLength() const {
return this->mAudioSettings.SampleLength;
}

constexpr int GetDesiredBuffered() const {
return this->mAudioSettings.DesiredBuffered;
}

void SetSampleRate(int rate) {
this->mAudioSettings.SampleRate = rate;
}

void SetSampleLength(int length) {
this->mAudioSettings.SampleLength = length;
}

void SetDesiredBuffered(int size) {
this->mAudioSettings.DesiredBuffered = size;
}

protected:
virtual bool DoInit(void) = 0;

private:
bool mInitialized;
bool mInitialized = false;
AudioSettings mAudioSettings;
};
} // namespace Ship

Expand Down
8 changes: 1 addition & 7 deletions src/audio/SDLAudioPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
#include <spdlog/spdlog.h>

namespace Ship {
SDLAudioPlayer::SDLAudioPlayer() : AudioPlayer() {
}

SDLAudioPlayer::~SDLAudioPlayer() {
SPDLOG_TRACE("destruct SDL audio player");
Expand All @@ -20,7 +18,7 @@ bool SDLAudioPlayer::DoInit(void) {
want.freq = this->GetSampleRate();
want.format = AUDIO_S16SYS;
want.channels = 2;
want.samples = 1024;
want.samples = this->GetSampleLength();
want.callback = NULL;
mDevice = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
if (mDevice == 0) {
Expand All @@ -36,10 +34,6 @@ int SDLAudioPlayer::Buffered(void) {
return SDL_GetQueuedAudioSize(mDevice) / 4;
}

int SDLAudioPlayer::GetDesiredBuffered(void) {
return 2480;
}

void SDLAudioPlayer::Play(const uint8_t* buf, size_t len) {
if (Buffered() < 6000) {
// Don't fill the audio buffer too much in case this happens
Expand Down
4 changes: 2 additions & 2 deletions src/audio/SDLAudioPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
namespace Ship {
class SDLAudioPlayer : public AudioPlayer {
public:
SDLAudioPlayer();
SDLAudioPlayer(AudioSettings settings) : AudioPlayer(settings) {
}
~SDLAudioPlayer();

int Buffered(void);
int GetDesiredBuffered(void);
void Play(const uint8_t* buf, size_t len);

protected:
Expand Down
6 changes: 0 additions & 6 deletions src/audio/WasapiAudioPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ const IID IID_IAudioClient = __uuidof(IAudioClient);
const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient);

namespace Ship {
WasapiAudioPlayer::WasapiAudioPlayer()
: mRefCount(1), mBufferFrameCount(0), mInitialized(false), mStarted(false), AudioPlayer(){};

void WasapiAudioPlayer::ThrowIfFailed(HRESULT res) {
if (FAILED(res)) {
Expand Down Expand Up @@ -77,10 +75,6 @@ int WasapiAudioPlayer::Buffered(void) {
} catch (HRESULT res) { return 0; }
}

int WasapiAudioPlayer::GetDesiredBuffered(void) {
return 2480;
}

void WasapiAudioPlayer::Play(const uint8_t* buf, size_t len) {
if (!mInitialized) {
if (!SetupStream()) {
Expand Down
12 changes: 6 additions & 6 deletions src/audio/WasapiAudioPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ using namespace Microsoft::WRL;
namespace Ship {
class WasapiAudioPlayer : public AudioPlayer, public IMMNotificationClient {
public:
WasapiAudioPlayer();
WasapiAudioPlayer(AudioSettings settings) : AudioPlayer(settings) {
}

int Buffered(void);
int GetDesiredBuffered(void);
void Play(const uint8_t* buf, size_t len);

protected:
Expand All @@ -36,10 +36,10 @@ class WasapiAudioPlayer : public AudioPlayer, public IMMNotificationClient {
ComPtr<IMMDevice> mDevice;
ComPtr<IAudioClient> mClient;
ComPtr<IAudioRenderClient> mRenderClient;
LONG mRefCount;
UINT32 mBufferFrameCount;
bool mInitialized;
bool mStarted;
LONG mRefCount = 1;
UINT32 mBufferFrameCount = 0;
bool mInitialized = false;
bool mStarted = false;
};
} // namespace Ship
#endif
Loading