AudioInputStream.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AudioInput/AudioInputStream.h>
  9. #include <Common_wwise.h>
  10. #include <AzCore/Casting/numeric_cast.h>
  11. #include <AK/SoundEngine/Common/AkStreamMgrModule.h>
  12. namespace Audio
  13. {
  14. ///////////////////////////////////////////////////////////////////////////////////////////////
  15. // Audio Streaming Input
  16. ///////////////////////////////////////////////////////////////////////////////////////////////
  17. ///////////////////////////////////////////////////////////////////////////////////////////////
  18. AudioInputStreaming::AudioInputStreaming(const SAudioInputConfig& sourceConfig)
  19. : m_framesReady(0)
  20. {
  21. m_config = sourceConfig;
  22. size_t bytesPerSample = (m_config.m_bitsPerSample >> 3);
  23. size_t numSamples = m_config.m_sampleRate * m_config.m_numChannels; // <-- This gives a 1 second buffer based on the configuration.
  24. m_config.m_bufferSize = static_cast<AZ::u32>(numSamples * bytesPerSample);
  25. if (m_config.m_sampleType == AudioInputSampleType::Float && m_config.m_bitsPerSample == 32)
  26. {
  27. m_buffer.reset(new RingBuffer<float>(numSamples));
  28. }
  29. else if (m_config.m_sampleType == AudioInputSampleType::Int && m_config.m_bitsPerSample == 16)
  30. {
  31. m_buffer.reset(new RingBuffer<AZ::s16>(numSamples));
  32. }
  33. else
  34. {
  35. AZ_Error("AudioInputStreaming", false, "Audio Stream Format Unsupported! Bits Per Sample = %d, Sample Type = %d",
  36. m_config.m_bitsPerSample, static_cast<int>(m_config.m_sampleType));
  37. }
  38. }
  39. ///////////////////////////////////////////////////////////////////////////////////////////////
  40. AudioInputStreaming::~AudioInputStreaming()
  41. {
  42. }
  43. ///////////////////////////////////////////////////////////////////////////////////////////////
  44. size_t AudioInputStreaming::ReadStreamingInput(const AudioStreamData& data)
  45. {
  46. size_t numFrames = data.m_sizeBytes / (m_config.m_bitsPerSample >> 3) / m_config.m_numChannels;
  47. size_t framesAdded = m_buffer->AddData(data.m_data, numFrames, m_config.m_numChannels);
  48. m_framesReady += framesAdded;
  49. return framesAdded;
  50. }
  51. ///////////////////////////////////////////////////////////////////////////////////////////////
  52. size_t AudioInputStreaming::ReadStreamingMultiTrackInput(AudioStreamMultiTrackData& data)
  53. {
  54. size_t numFrames = data.m_sizeBytes / (m_config.m_bitsPerSample >> 3);
  55. size_t framesAdded = m_buffer->AddMultiTrackDataInterleaved(data.m_data, numFrames, m_config.m_numChannels);
  56. m_framesReady += framesAdded;
  57. return framesAdded;
  58. }
  59. ///////////////////////////////////////////////////////////////////////////////////////////////
  60. void AudioInputStreaming::FlushStreamingInput()
  61. {
  62. m_buffer->ResetBuffer();
  63. m_framesReady = 0;
  64. }
  65. ///////////////////////////////////////////////////////////////////////////////////////////////
  66. size_t AudioInputStreaming::GetStreamingInputNumFramesReady() const
  67. {
  68. return m_framesReady;
  69. }
  70. ///////////////////////////////////////////////////////////////////////////////////////////////
  71. void AudioInputStreaming::ReadInput([[maybe_unused]] const AudioStreamData& data)
  72. {
  73. // Intentionally left as an empty implementation.
  74. }
  75. ///////////////////////////////////////////////////////////////////////////////////////////////
  76. void AudioInputStreaming::WriteOutput(AkAudioBuffer* akBuffer)
  77. {
  78. AZ::u16 numSampleFramesRequested = (akBuffer->MaxFrames() - akBuffer->uValidFrames);
  79. AkSampleType* channelData[6] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
  80. for (AZ::u32 channel = 0; channel < akBuffer->NumChannels(); ++channel)
  81. {
  82. channelData[channel] = akBuffer->GetChannel(channel);
  83. }
  84. bool deinterleave = (m_config.m_sampleType == AudioInputSampleType::Float);
  85. size_t numSampleFramesCopied = m_buffer->ConsumeData(reinterpret_cast<void**>(channelData), numSampleFramesRequested, akBuffer->NumChannels(), deinterleave);
  86. akBuffer->uValidFrames += aznumeric_cast<AkUInt16>(numSampleFramesCopied);
  87. m_framesReady -= numSampleFramesCopied;
  88. akBuffer->eState = (numSampleFramesCopied > 0) ? AK_DataReady : AK_NoDataReady;
  89. }
  90. ///////////////////////////////////////////////////////////////////////////////////////////////
  91. bool AudioInputStreaming::IsOk() const
  92. {
  93. return true;
  94. }
  95. ///////////////////////////////////////////////////////////////////////////////////////////////
  96. void AudioInputStreaming::OnActivated()
  97. {
  98. AZ_Assert(m_config.m_sourceId != INVALID_AUDIO_SOURCE_ID, "AudioInputStreaming - Being activated but no valid Source Id!\n");
  99. AudioStreamingRequestBus::Handler::BusConnect(m_config.m_sourceId);
  100. }
  101. ///////////////////////////////////////////////////////////////////////////////////////////////
  102. void AudioInputStreaming::OnDeactivated()
  103. {
  104. AudioStreamingRequestBus::Handler::BusDisconnect();
  105. }
  106. } // namespace Audio