Mixer.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2009 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <atomic>
  6. #include "AudioCommon/AudioStretcher.h"
  7. #include "AudioCommon/SurroundDecoder.h"
  8. #include "AudioCommon/WaveFile.h"
  9. #include "Common/CommonTypes.h"
  10. #include "Common/Config/Config.h"
  11. class PointerWrap;
  12. class Mixer final
  13. {
  14. public:
  15. explicit Mixer(unsigned int BackendSampleRate);
  16. ~Mixer();
  17. void DoState(PointerWrap& p);
  18. // Called from audio threads
  19. unsigned int Mix(short* samples, unsigned int numSamples);
  20. unsigned int MixSurround(float* samples, unsigned int num_samples);
  21. // Called from main thread
  22. void PushSamples(const short* samples, unsigned int num_samples);
  23. void PushStreamingSamples(const short* samples, unsigned int num_samples);
  24. void PushWiimoteSpeakerSamples(const short* samples, unsigned int num_samples,
  25. unsigned int sample_rate_divisor);
  26. void PushSkylanderPortalSamples(const u8* samples, unsigned int num_samples);
  27. void PushGBASamples(int device_number, const short* samples, unsigned int num_samples);
  28. unsigned int GetSampleRate() const { return m_sampleRate; }
  29. void SetDMAInputSampleRateDivisor(unsigned int rate_divisor);
  30. void SetStreamInputSampleRateDivisor(unsigned int rate_divisor);
  31. void SetGBAInputSampleRateDivisors(int device_number, unsigned int rate_divisor);
  32. void SetStreamingVolume(unsigned int lvolume, unsigned int rvolume);
  33. void SetWiimoteSpeakerVolume(unsigned int lvolume, unsigned int rvolume);
  34. void SetGBAVolume(int device_number, unsigned int lvolume, unsigned int rvolume);
  35. void StartLogDTKAudio(const std::string& filename);
  36. void StopLogDTKAudio();
  37. void StartLogDSPAudio(const std::string& filename);
  38. void StopLogDSPAudio();
  39. // 54000000 doesn't work here as it doesn't evenly divide with 32000, but 108000000 does
  40. static constexpr u64 FIXED_SAMPLE_RATE_DIVIDEND = 54000000 * 2;
  41. private:
  42. static constexpr u32 MAX_SAMPLES = 1024 * 4; // 128 ms
  43. static constexpr u32 INDEX_MASK = MAX_SAMPLES * 2 - 1;
  44. static constexpr int MAX_FREQ_SHIFT = 200; // Per 32000 Hz
  45. static constexpr float CONTROL_FACTOR = 0.2f;
  46. static constexpr u32 CONTROL_AVG = 32; // In freq_shift per FIFO size offset
  47. const unsigned int SURROUND_CHANNELS = 6;
  48. class MixerFifo final
  49. {
  50. public:
  51. MixerFifo(Mixer* mixer, unsigned sample_rate_divisor, bool little_endian)
  52. : m_mixer(mixer), m_input_sample_rate_divisor(sample_rate_divisor),
  53. m_little_endian(little_endian)
  54. {
  55. }
  56. void DoState(PointerWrap& p);
  57. void PushSamples(const short* samples, unsigned int num_samples);
  58. unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit,
  59. float emulationspeed, int timing_variance);
  60. void SetInputSampleRateDivisor(unsigned int rate_divisor);
  61. unsigned int GetInputSampleRateDivisor() const;
  62. void SetVolume(unsigned int lvolume, unsigned int rvolume);
  63. std::pair<s32, s32> GetVolume() const;
  64. unsigned int AvailableSamples() const;
  65. private:
  66. Mixer* m_mixer;
  67. unsigned m_input_sample_rate_divisor;
  68. bool m_little_endian;
  69. std::array<short, MAX_SAMPLES * 2> m_buffer{};
  70. std::atomic<u32> m_indexW{0};
  71. std::atomic<u32> m_indexR{0};
  72. // Volume ranges from 0-256
  73. std::atomic<s32> m_LVolume{256};
  74. std::atomic<s32> m_RVolume{256};
  75. float m_numLeftI = 0.0f;
  76. u32 m_frac = 0;
  77. };
  78. void RefreshConfig();
  79. MixerFifo m_dma_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 32000, false};
  80. MixerFifo m_streaming_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, false};
  81. MixerFifo m_wiimote_speaker_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 3000, true};
  82. MixerFifo m_skylander_portal_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 8000, true};
  83. std::array<MixerFifo, 4> m_gba_mixers{MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true},
  84. MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true},
  85. MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true},
  86. MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true}};
  87. unsigned int m_sampleRate;
  88. bool m_is_stretching = false;
  89. AudioCommon::AudioStretcher m_stretcher;
  90. AudioCommon::SurroundDecoder m_surround_decoder;
  91. std::array<short, MAX_SAMPLES * 2> m_scratch_buffer{};
  92. WaveFileWriter m_wave_writer_dtk;
  93. WaveFileWriter m_wave_writer_dsp;
  94. bool m_log_dtk_audio = false;
  95. bool m_log_dsp_audio = false;
  96. float m_config_emulation_speed;
  97. int m_config_timing_variance;
  98. bool m_config_audio_stretch;
  99. Config::ConfigChangedCallbackID m_config_changed_callback_id;
  100. };