audio_renderer.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // Copyright 2018 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <array>
  6. #include <memory>
  7. #include <vector>
  8. #include "audio_core/algorithm/interpolate.h"
  9. #include "audio_core/audio_out.h"
  10. #include "audio_core/codec.h"
  11. #include "audio_core/stream.h"
  12. #include "common/common_types.h"
  13. #include "common/swap.h"
  14. #include "core/hle/kernel/event.h"
  15. namespace AudioCore {
  16. enum class PlayState : u8 {
  17. Started = 0,
  18. Stopped = 1,
  19. Paused = 2,
  20. };
  21. struct AudioRendererParameter {
  22. u32_le sample_rate;
  23. u32_le sample_count;
  24. u32_le mix_buffer_count;
  25. u32_le unknown_c;
  26. u32_le voice_count;
  27. u32_le sink_count;
  28. u32_le effect_count;
  29. u32_le unknown_1c;
  30. u8 unknown_20;
  31. INSERT_PADDING_BYTES(3);
  32. u32_le splitter_count;
  33. u32_le unknown_2c;
  34. INSERT_PADDING_WORDS(1);
  35. u32_le revision;
  36. };
  37. static_assert(sizeof(AudioRendererParameter) == 52, "AudioRendererParameter is an invalid size");
  38. enum class MemoryPoolStates : u32 { // Should be LE
  39. Invalid = 0x0,
  40. Unknown = 0x1,
  41. RequestDetach = 0x2,
  42. Detached = 0x3,
  43. RequestAttach = 0x4,
  44. Attached = 0x5,
  45. Released = 0x6,
  46. };
  47. struct MemoryPoolEntry {
  48. MemoryPoolStates state;
  49. u32_le unknown_4;
  50. u32_le unknown_8;
  51. u32_le unknown_c;
  52. };
  53. static_assert(sizeof(MemoryPoolEntry) == 0x10, "MemoryPoolEntry has wrong size");
  54. struct MemoryPoolInfo {
  55. u64_le pool_address;
  56. u64_le pool_size;
  57. MemoryPoolStates pool_state;
  58. INSERT_PADDING_WORDS(3); // Unknown
  59. };
  60. static_assert(sizeof(MemoryPoolInfo) == 0x20, "MemoryPoolInfo has wrong size");
  61. struct BiquadFilter {
  62. u8 enable;
  63. INSERT_PADDING_BYTES(1);
  64. std::array<s16_le, 3> numerator;
  65. std::array<s16_le, 2> denominator;
  66. };
  67. static_assert(sizeof(BiquadFilter) == 0xc, "BiquadFilter has wrong size");
  68. struct WaveBuffer {
  69. u64_le buffer_addr;
  70. u64_le buffer_sz;
  71. s32_le start_sample_offset;
  72. s32_le end_sample_offset;
  73. u8 is_looping;
  74. u8 end_of_stream;
  75. u8 sent_to_server;
  76. INSERT_PADDING_BYTES(5);
  77. u64 context_addr;
  78. u64 context_sz;
  79. INSERT_PADDING_BYTES(8);
  80. };
  81. static_assert(sizeof(WaveBuffer) == 0x38, "WaveBuffer has wrong size");
  82. struct VoiceInfo {
  83. u32_le id;
  84. u32_le node_id;
  85. u8 is_new;
  86. u8 is_in_use;
  87. PlayState play_state;
  88. u8 sample_format;
  89. u32_le sample_rate;
  90. u32_le priority;
  91. u32_le sorting_order;
  92. u32_le channel_count;
  93. float_le pitch;
  94. float_le volume;
  95. std::array<BiquadFilter, 2> biquad_filter;
  96. u32_le wave_buffer_count;
  97. u32_le wave_buffer_head;
  98. INSERT_PADDING_WORDS(1);
  99. u64_le additional_params_addr;
  100. u64_le additional_params_sz;
  101. u32_le mix_id;
  102. u32_le splitter_info_id;
  103. std::array<WaveBuffer, 4> wave_buffer;
  104. std::array<u32_le, 6> voice_channel_resource_ids;
  105. INSERT_PADDING_BYTES(24);
  106. };
  107. static_assert(sizeof(VoiceInfo) == 0x170, "VoiceInfo is wrong size");
  108. struct VoiceOutStatus {
  109. u64_le played_sample_count;
  110. u32_le wave_buffer_consumed;
  111. u32_le voice_drops_count;
  112. };
  113. static_assert(sizeof(VoiceOutStatus) == 0x10, "VoiceOutStatus has wrong size");
  114. struct UpdateDataHeader {
  115. UpdateDataHeader() {}
  116. explicit UpdateDataHeader(const AudioRendererParameter& config) {
  117. revision = Common::MakeMagic('R', 'E', 'V', '4'); // 5.1.0 Revision
  118. behavior_size = 0xb0;
  119. memory_pools_size = (config.effect_count + (config.voice_count * 4)) * 0x10;
  120. voices_size = config.voice_count * 0x10;
  121. voice_resource_size = 0x0;
  122. effects_size = config.effect_count * 0x10;
  123. mixes_size = 0x0;
  124. sinks_size = config.sink_count * 0x20;
  125. performance_manager_size = 0x10;
  126. total_size = sizeof(UpdateDataHeader) + behavior_size + memory_pools_size + voices_size +
  127. effects_size + sinks_size + performance_manager_size;
  128. }
  129. u32_le revision;
  130. u32_le behavior_size;
  131. u32_le memory_pools_size;
  132. u32_le voices_size;
  133. u32_le voice_resource_size;
  134. u32_le effects_size;
  135. u32_le mixes_size;
  136. u32_le sinks_size;
  137. u32_le performance_manager_size;
  138. INSERT_PADDING_WORDS(6);
  139. u32_le total_size;
  140. };
  141. static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has wrong size");
  142. class AudioRenderer {
  143. public:
  144. AudioRenderer(AudioRendererParameter params, Kernel::SharedPtr<Kernel::Event> buffer_event);
  145. std::vector<u8> UpdateAudioRenderer(const std::vector<u8>& input_params);
  146. void QueueMixedBuffer(Buffer::Tag tag);
  147. void ReleaseAndQueueBuffers();
  148. u32 GetSampleRate() const;
  149. u32 GetSampleCount() const;
  150. u32 GetMixBufferCount() const;
  151. private:
  152. class VoiceState {
  153. public:
  154. bool IsPlaying() const {
  155. return is_in_use && info.play_state == PlayState::Started;
  156. }
  157. const VoiceOutStatus& GetOutStatus() const {
  158. return out_status;
  159. }
  160. const VoiceInfo& GetInfo() const {
  161. return info;
  162. }
  163. VoiceInfo& Info() {
  164. return info;
  165. }
  166. void SetWaveIndex(size_t index);
  167. std::vector<s16> DequeueSamples(size_t sample_count);
  168. void UpdateState();
  169. void RefreshBuffer();
  170. private:
  171. bool is_in_use{};
  172. bool is_refresh_pending{};
  173. size_t wave_index{};
  174. size_t offset{};
  175. Codec::ADPCMState adpcm_state{};
  176. InterpolationState interp_state{};
  177. std::vector<s16> samples;
  178. VoiceOutStatus out_status{};
  179. VoiceInfo info{};
  180. };
  181. AudioRendererParameter worker_params;
  182. Kernel::SharedPtr<Kernel::Event> buffer_event;
  183. std::vector<VoiceState> voices;
  184. std::unique_ptr<AudioCore::AudioOut> audio_core;
  185. AudioCore::StreamPtr stream;
  186. };
  187. } // namespace AudioCore