summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2019-03-07 05:35:49 -0500
committerGravatar Lioncash2019-03-07 05:37:08 -0500
commitd41d85766fac0ef1e8b6ac356e0aaffc67fd2a0e (patch)
tree033e26f35dc2c14819aee7bd0c6fe14e654c6ec2
parentservice/audio/hwopus: Enclose internals in an anonymous namespace (diff)
downloadyuzu-d41d85766fac0ef1e8b6ac356e0aaffc67fd2a0e.tar.gz
yuzu-d41d85766fac0ef1e8b6ac356e0aaffc67fd2a0e.tar.xz
yuzu-d41d85766fac0ef1e8b6ac356e0aaffc67fd2a0e.zip
service/audio/hwopus: Move Opus packet header out of the IHardwareOpusDecoderManager
This will be utilized by more than just that class in the future. This also renames it from OpusHeader to OpusPacketHeader to be more specific about what kind of header it is.
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/audio/hwopus.cpp34
1 files changed, 17 insertions, 17 deletions
diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp
index 00a4b9d53..61af2e6d6 100644
--- a/src/core/hle/service/audio/hwopus.cpp
+++ b/src/core/hle/service/audio/hwopus.cpp
@@ -23,6 +23,12 @@ struct OpusDeleter {
23 } 23 }
24}; 24};
25 25
26struct OpusPacketHeader {
27 u32_be size;
28 INSERT_PADDING_WORDS(1);
29};
30static_assert(sizeof(OpusPacketHeader) == 0x8, "OpusHeader is an invalid size");
31
26class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> { 32class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> {
27public: 33public:
28 IHardwareOpusDecoderManager(std::unique_ptr<OpusDecoder, OpusDeleter> decoder, u32 sample_rate, 34 IHardwareOpusDecoderManager(std::unique_ptr<OpusDecoder, OpusDeleter> decoder, u32 sample_rate,
@@ -113,23 +119,23 @@ private:
113 std::vector<opus_int16>& output, u64* out_performance_time) { 119 std::vector<opus_int16>& output, u64* out_performance_time) {
114 const auto start_time = std::chrono::high_resolution_clock::now(); 120 const auto start_time = std::chrono::high_resolution_clock::now();
115 const std::size_t raw_output_sz = output.size() * sizeof(opus_int16); 121 const std::size_t raw_output_sz = output.size() * sizeof(opus_int16);
116 if (sizeof(OpusHeader) > input.size()) { 122 if (sizeof(OpusPacketHeader) > input.size()) {
117 LOG_ERROR(Audio, "Input is smaller than the header size, header_sz={}, input_sz={}", 123 LOG_ERROR(Audio, "Input is smaller than the header size, header_sz={}, input_sz={}",
118 sizeof(OpusHeader), input.size()); 124 sizeof(OpusPacketHeader), input.size());
119 return false; 125 return false;
120 } 126 }
121 127
122 OpusHeader hdr{}; 128 OpusPacketHeader hdr{};
123 std::memcpy(&hdr, input.data(), sizeof(OpusHeader)); 129 std::memcpy(&hdr, input.data(), sizeof(OpusPacketHeader));
124 if (sizeof(OpusHeader) + static_cast<u32>(hdr.sz) > input.size()) { 130 if (sizeof(OpusPacketHeader) + static_cast<u32>(hdr.size) > input.size()) {
125 LOG_ERROR(Audio, "Input does not fit in the opus header size. data_sz={}, input_sz={}", 131 LOG_ERROR(Audio, "Input does not fit in the opus header size. data_sz={}, input_sz={}",
126 sizeof(OpusHeader) + static_cast<u32>(hdr.sz), input.size()); 132 sizeof(OpusPacketHeader) + static_cast<u32>(hdr.size), input.size());
127 return false; 133 return false;
128 } 134 }
129 135
130 const auto frame = input.data() + sizeof(OpusHeader); 136 const auto frame = input.data() + sizeof(OpusPacketHeader);
131 const auto decoded_sample_count = opus_packet_get_nb_samples( 137 const auto decoded_sample_count = opus_packet_get_nb_samples(
132 frame, static_cast<opus_int32>(input.size() - sizeof(OpusHeader)), 138 frame, static_cast<opus_int32>(input.size() - sizeof(OpusPacketHeader)),
133 static_cast<opus_int32>(sample_rate)); 139 static_cast<opus_int32>(sample_rate));
134 if (decoded_sample_count * channel_count * sizeof(u16) > raw_output_sz) { 140 if (decoded_sample_count * channel_count * sizeof(u16) > raw_output_sz) {
135 LOG_ERROR( 141 LOG_ERROR(
@@ -141,18 +147,18 @@ private:
141 147
142 const int frame_size = (static_cast<int>(raw_output_sz / sizeof(s16) / channel_count)); 148 const int frame_size = (static_cast<int>(raw_output_sz / sizeof(s16) / channel_count));
143 const auto out_sample_count = 149 const auto out_sample_count =
144 opus_decode(decoder.get(), frame, hdr.sz, output.data(), frame_size, 0); 150 opus_decode(decoder.get(), frame, hdr.size, output.data(), frame_size, 0);
145 if (out_sample_count < 0) { 151 if (out_sample_count < 0) {
146 LOG_ERROR(Audio, 152 LOG_ERROR(Audio,
147 "Incorrect sample count received from opus_decode, " 153 "Incorrect sample count received from opus_decode, "
148 "output_sample_count={}, frame_size={}, data_sz_from_hdr={}", 154 "output_sample_count={}, frame_size={}, data_sz_from_hdr={}",
149 out_sample_count, frame_size, static_cast<u32>(hdr.sz)); 155 out_sample_count, frame_size, static_cast<u32>(hdr.size));
150 return false; 156 return false;
151 } 157 }
152 158
153 const auto end_time = std::chrono::high_resolution_clock::now() - start_time; 159 const auto end_time = std::chrono::high_resolution_clock::now() - start_time;
154 sample_count = out_sample_count; 160 sample_count = out_sample_count;
155 consumed = static_cast<u32>(sizeof(OpusHeader) + hdr.sz); 161 consumed = static_cast<u32>(sizeof(OpusPacketHeader) + hdr.size);
156 if (out_performance_time != nullptr) { 162 if (out_performance_time != nullptr) {
157 *out_performance_time = 163 *out_performance_time =
158 std::chrono::duration_cast<std::chrono::milliseconds>(end_time).count(); 164 std::chrono::duration_cast<std::chrono::milliseconds>(end_time).count();
@@ -167,12 +173,6 @@ private:
167 opus_decoder_ctl(decoder.get(), OPUS_RESET_STATE); 173 opus_decoder_ctl(decoder.get(), OPUS_RESET_STATE);
168 } 174 }
169 175
170 struct OpusHeader {
171 u32_be sz; // Needs to be BE for some odd reason
172 INSERT_PADDING_WORDS(1);
173 };
174 static_assert(sizeof(OpusHeader) == 0x8, "OpusHeader is an invalid size");
175
176 std::unique_ptr<OpusDecoder, OpusDeleter> decoder; 176 std::unique_ptr<OpusDecoder, OpusDeleter> decoder;
177 u32 sample_rate; 177 u32 sample_rate;
178 u32 channel_count; 178 u32 channel_count;