Initial Commit

Added Device logic to Sinks
Started on UI for selecting devices
This commit is contained in:
Zach Toogood 2016-07-12 23:19:26 +01:00
parent ffda82eea5
commit bac2124fb9
10 changed files with 96 additions and 5 deletions

View File

@ -71,6 +71,13 @@ void SelectSink(std::string sink_id) {
DSP::HLE::SetSink(iter->factory()); DSP::HLE::SetSink(iter->factory());
} }
void SelectDevice(std::string device_id){
if (device_id == "") {
LOG_ERROR(Audio, "AudioCore::SelectDevice given invalid device_id");
return;
}
}
void Shutdown() { void Shutdown() {
CoreTiming::UnscheduleEvent(tick_event, 0); CoreTiming::UnscheduleEvent(tick_event, 0);
DSP::HLE::Shutdown(); DSP::HLE::Shutdown();

View File

@ -23,6 +23,9 @@ void AddAddressSpace(Kernel::VMManager& vm_manager);
/// Select the sink to use based on sink id. /// Select the sink to use based on sink id.
void SelectSink(std::string sink_id); void SelectSink(std::string sink_id);
/// Select the device to use based on device id.
void SelectDevice(std::string device_id);
/// Shutdown Audio Core /// Shutdown Audio Core
void Shutdown(); void Shutdown();

View File

@ -5,6 +5,7 @@
#pragma once #pragma once
#include <cstddef> #include <cstddef>
#include <map>
#include "audio_core/audio_core.h" #include "audio_core/audio_core.h"
#include "audio_core/sink.h" #include "audio_core/sink.h"
@ -24,6 +25,12 @@ public:
size_t SamplesInQueue() const override { size_t SamplesInQueue() const override {
return 0; return 0;
} }
void SetDevice(int device_id) override {}
std::map<int, std::string>* GetDeviceMap() override {
return nullptr;
}
}; };
} // namespace AudioCore } // namespace AudioCore

View File

@ -10,6 +10,8 @@
#include "audio_core/audio_core.h" #include "audio_core/audio_core.h"
#include "audio_core/sdl2_sink.h" #include "audio_core/sdl2_sink.h"
#include "core/settings.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include <numeric> #include <numeric>
@ -45,11 +47,29 @@ SDL2Sink::SDL2Sink() : impl(std::make_unique<Impl>()) {
SDL_AudioSpec obtained_audiospec; SDL_AudioSpec obtained_audiospec;
SDL_zero(obtained_audiospec); SDL_zero(obtained_audiospec);
int device_count = SDL_GetNumAudioDevices(0);
device_map.clear();
for (int i = 0; i < device_count; ++i) {
device_map[i] = SDL_GetAudioDeviceName(i, 0);
}
if (device_count < 1 ||
Settings::values.audio_device_id == "auto" ||
Settings::values.audio_device_id == "") {
impl->audio_device_id = SDL_OpenAudioDevice(nullptr, false, &desired_audiospec, &obtained_audiospec, 0); impl->audio_device_id = SDL_OpenAudioDevice(nullptr, false, &desired_audiospec, &obtained_audiospec, 0);
if (impl->audio_device_id <= 0) { if (impl->audio_device_id <= 0) {
LOG_CRITICAL(Audio_Sink, "SDL_OpenAudioDevice failed"); LOG_CRITICAL(Audio_Sink, "SDL_OpenAudioDevice failed");
return; return;
} }
}
else
{
impl->audio_device_id = SDL_OpenAudioDevice(device_map[device_id].c_str(), false, &desired_audiospec, &obtained_audiospec, 0);
if (impl->audio_device_id <= 0) {
LOG_CRITICAL(Audio_Sink, "SDL_OpenAudioDevice failed");
return;
}
}
impl->sample_rate = obtained_audiospec.freq; impl->sample_rate = obtained_audiospec.freq;
@ -99,6 +119,14 @@ size_t SDL2Sink::SamplesInQueue() const {
return total_size; return total_size;
} }
void SDL2Sink::SetDevice(int _device_id) {
this->device_id = _device_id;
}
std::map<int, std::string>* SDL2Sink::GetDeviceMap() {
return &device_map;
}
void SDL2Sink::Impl::Callback(void* impl_, u8* buffer, int buffer_size_in_bytes) { void SDL2Sink::Impl::Callback(void* impl_, u8* buffer, int buffer_size_in_bytes) {
Impl* impl = reinterpret_cast<Impl*>(impl_); Impl* impl = reinterpret_cast<Impl*>(impl_);

View File

@ -6,6 +6,7 @@
#include <cstddef> #include <cstddef>
#include <memory> #include <memory>
#include <map>
#include "audio_core/sink.h" #include "audio_core/sink.h"
@ -22,9 +23,16 @@ public:
size_t SamplesInQueue() const override; size_t SamplesInQueue() const override;
std::map<int, std::string>* GetDeviceMap();
void SetDevice(int _device_id);
private: private:
struct Impl; struct Impl;
std::unique_ptr<Impl> impl; std::unique_ptr<Impl> impl;
int device_id;
std::map<int, std::string> device_map;
}; };
extern const std::map<int, std::string> g_device_map;
} // namespace AudioCore } // namespace AudioCore

View File

@ -5,6 +5,7 @@
#pragma once #pragma once
#include <vector> #include <vector>
#include <map>
#include "common/common_types.h" #include "common/common_types.h"
@ -29,6 +30,9 @@ public:
/// Samples enqueued that have not been played yet. /// Samples enqueued that have not been played yet.
virtual std::size_t SamplesInQueue() const = 0; virtual std::size_t SamplesInQueue() const = 0;
virtual void SetDevice(int device_id) = 0;
virtual std::map<int, std::string>* GetDeviceMap() = 0;
}; };
} // namespace } // namespace

View File

@ -21,6 +21,12 @@ ConfigureAudio::ConfigureAudio(QWidget* parent) :
ui->output_sink_combo_box->addItem(sink_detail.id); ui->output_sink_combo_box->addItem(sink_detail.id);
} }
ui->audio_device_combo_box->clear();
ui->audio_device_combo_box->addItem("auto");
//for (const auto& device : AudioCore:) {
// ui->audio_device_combo_box->addItem(device.second.c_str());
//}
this->setConfiguration(); this->setConfiguration();
} }
@ -36,9 +42,20 @@ void ConfigureAudio::setConfiguration() {
} }
} }
ui->output_sink_combo_box->setCurrentIndex(new_sink_index); ui->output_sink_combo_box->setCurrentIndex(new_sink_index);
int new_device_index = -1;
for (int index = 0; index < ui->audio_device_combo_box->count(); index++) {
if (ui->audio_device_combo_box->itemText(index).toStdString() == Settings::values.audio_device_id) {
new_device_index = index;
break;
}
}
ui->audio_device_combo_box->setCurrentIndex(new_sink_index);
} }
void ConfigureAudio::applyConfiguration() { void ConfigureAudio::applyConfiguration() {
Settings::values.sink_id = ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()).toStdString(); Settings::values.sink_id = ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()).toStdString();
Settings::values.audio_device_id = ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex()).toStdString();
Settings::Apply(); Settings::Apply();
} }

View File

@ -25,6 +25,21 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QLabel">
<property name="text">
<string>Audio Device:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audio_device_combo_box">
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

View File

@ -24,7 +24,7 @@ void Apply() {
VideoCore::g_scaled_resolution_enabled = values.use_scaled_resolution; VideoCore::g_scaled_resolution_enabled = values.use_scaled_resolution;
AudioCore::SelectSink(values.sink_id); AudioCore::SelectSink(values.sink_id);
AudioCore::SelectDevice(values.audio_device_id);
} }
} // namespace } // namespace

View File

@ -6,6 +6,7 @@
#include <string> #include <string>
#include <array> #include <array>
#include <map>
#include "common/common_types.h" #include "common/common_types.h"
@ -81,6 +82,7 @@ struct Values {
// Audio // Audio
std::string sink_id; std::string sink_id;
std::string audio_device_id;
// Debugging // Debugging
bool use_gdbstub; bool use_gdbstub;