yuzu-emu
/
yuzu
Archived
1
0
Fork 0

audio_core: Misc. improvements to stream/buffer/audio_out.

This commit is contained in:
bunnei 2018-07-28 13:35:22 -04:00
parent eaf66b4c9f
commit 0e8a2c7222
5 changed files with 32 additions and 20 deletions

View File

@ -9,7 +9,7 @@
namespace AudioCore { namespace AudioCore {
/// Returns the stream format from the specified number of channels /// Returns the stream format from the specified number of channels
static Stream::Format ChannelsToStreamFormat(int num_channels) { static Stream::Format ChannelsToStreamFormat(u32 num_channels) {
switch (num_channels) { switch (num_channels) {
case 1: case 1:
return Stream::Format::Mono16; return Stream::Format::Mono16;
@ -24,7 +24,7 @@ static Stream::Format ChannelsToStreamFormat(int num_channels) {
return {}; return {};
} }
StreamPtr AudioOut::OpenStream(int sample_rate, int num_channels, StreamPtr AudioOut::OpenStream(u32 sample_rate, u32 num_channels,
Stream::ReleaseCallback&& release_callback) { Stream::ReleaseCallback&& release_callback) {
streams.push_back(std::make_shared<Stream>(sample_rate, ChannelsToStreamFormat(num_channels), streams.push_back(std::make_shared<Stream>(sample_rate, ChannelsToStreamFormat(num_channels),
std::move(release_callback))); std::move(release_callback)));

View File

@ -13,15 +13,13 @@
namespace AudioCore { namespace AudioCore {
using StreamPtr = std::shared_ptr<Stream>;
/** /**
* Represents an audio playback interface, used to open and play audio streams * Represents an audio playback interface, used to open and play audio streams
*/ */
class AudioOut { class AudioOut {
public: public:
/// Opens a new audio stream /// Opens a new audio stream
StreamPtr OpenStream(int sample_rate, int num_channels, StreamPtr OpenStream(u32 sample_rate, u32 num_channels,
Stream::ReleaseCallback&& release_callback); Stream::ReleaseCallback&& release_callback);
/// Returns a vector of recently released buffers specified by tag for the specified stream /// Returns a vector of recently released buffers specified by tag for the specified stream
@ -37,7 +35,7 @@ public:
bool QueueBuffer(StreamPtr stream, Buffer::Tag tag, std::vector<u8>&& data); bool QueueBuffer(StreamPtr stream, Buffer::Tag tag, std::vector<u8>&& data);
private: private:
/// Active audio streams on the interface SinkPtr sink;
std::vector<StreamPtr> streams; std::vector<StreamPtr> streams;
}; };

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <memory>
#include <vector> #include <vector>
#include "common/common_types.h" #include "common/common_types.h"
@ -34,4 +35,6 @@ private:
std::vector<u8> data; std::vector<u8> data;
}; };
using BufferPtr = std::shared_ptr<Buffer>;
} // namespace AudioCore } // namespace AudioCore

View File

@ -13,24 +13,24 @@ namespace AudioCore {
constexpr size_t MaxAudioBufferCount{32}; constexpr size_t MaxAudioBufferCount{32};
/// Returns the sample size for the specified audio stream format u32 Stream::GetNumChannels() const {
static size_t SampleSizeFromFormat(Stream::Format format) {
switch (format) { switch (format) {
case Stream::Format::Mono16: case Format::Mono16:
return 1;
case Format::Stereo16:
return 2; return 2;
case Stream::Format::Stereo16: case Format::Multi51Channel16:
return 4; return 6;
case Stream::Format::Multi51Channel16: }
return 12;
};
LOG_CRITICAL(Audio, "Unimplemented format={}", static_cast<u32>(format)); LOG_CRITICAL(Audio, "Unimplemented format={}", static_cast<u32>(format));
UNREACHABLE(); UNREACHABLE();
return {}; return {};
} }
Stream::Stream(int sample_rate, Format format, ReleaseCallback&& release_callback) u32 Stream::GetSampleSize() const {
: sample_rate{sample_rate}, format{format}, release_callback{std::move(release_callback)} { return GetNumChannels() * 2;
}
release_event = CoreTiming::RegisterEvent( release_event = CoreTiming::RegisterEvent(
"Stream::Release", [this](u64 userdata, int cycles_late) { ReleaseActiveBuffer(); }); "Stream::Release", [this](u64 userdata, int cycles_late) { ReleaseActiveBuffer(); });
} }
@ -45,7 +45,7 @@ void Stream::Stop() {
} }
s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const { s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const {
const size_t num_samples{buffer.GetData().size() / SampleSizeFromFormat(format)}; const size_t num_samples{buffer.GetData().size() / GetSampleSize()};
return CoreTiming::usToCycles((static_cast<u64>(num_samples) * 1000000) / sample_rate); return CoreTiming::usToCycles((static_cast<u64>(num_samples) * 1000000) / sample_rate);
} }

View File

@ -16,8 +16,6 @@
namespace AudioCore { namespace AudioCore {
using BufferPtr = std::shared_ptr<Buffer>;
/** /**
* Represents an audio stream, which is a sequence of queued buffers, to be outputed by AudioOut * Represents an audio stream, which is a sequence of queued buffers, to be outputed by AudioOut
*/ */
@ -60,6 +58,17 @@ public:
return queued_buffers.size(); return queued_buffers.size();
} }
/// Gets the sample rate
u32 GetSampleRate() const {
return sample_rate;
}
/// Gets the number of channels
u32 GetNumChannels() const;
/// Gets the sample size in bytes
u32 GetSampleSize() const;
private: private:
/// Current state of the stream /// Current state of the stream
enum class State { enum class State {
@ -86,4 +95,6 @@ private:
std::queue<BufferPtr> released_buffers; ///< Buffers recently released from the stream std::queue<BufferPtr> released_buffers; ///< Buffers recently released from the stream
}; };
using StreamPtr = std::shared_ptr<Stream>;
} // namespace AudioCore } // namespace AudioCore