3 #if SILICONSTUDIO_PLATFORM_ANDROID
6 using System.Collections.Generic;
7 using System.Threading;
10 using SiliconStudio.Paradox.Audio.Wave;
12 using SiliconStudio.Core.Extensions;
14 namespace SiliconStudio.
Paradox.Audio
16 partial class DynamicSoundEffectInstance
21 private const int NbOfSubBuffers = 3;
26 private SubBufferDataHandles currentSubBufferHandles;
31 private int dataNeededToFillCurSubBuffer ;
36 internal int SubBufferSize;
41 private int nbOfAudioFrameAvailable;
46 private readonly
object internalLock =
new object();
51 private class UserBuffer
55 public readonly byte[]
Buffer;
57 public UserBuffer(
int offset,
int byteCount, byte[] buffer)
60 ByteCount = byteCount;
68 private readonly Queue<UserBuffer> pendingUserBuffers =
new Queue<UserBuffer>();
70 private void InitializeDynamicSound()
80 private void OnSubBufferConsumed(
object sender,
EventArgs e)
99 private void OnAllDataConsumed(
object sender,
EventArgs e)
114 internal void RebuildVoice()
117 CreateVoice(WaveFormat);
121 UpdateStereoVolumes();
124 private void SubmitBufferImpl(byte[] buffer,
int offset,
int byteCount)
148 private void AudioTrackWrite(byte[] buffer,
int offset,
int byteCount)
171 private void WriteUserBuffersToAudioTrack()
179 while (internalPendingBufferCount < NbOfSubBuffers)
181 if (pendingUserBuffers.Count == 0)
184 var userBuffer = pendingUserBuffers.Peek();
186 if (userBuffer.ByteCount > dataNeededToFillCurSubBuffer)
188 AudioTrackWrite(userBuffer.Buffer, userBuffer.Offset, dataNeededToFillCurSubBuffer);
190 Interlocked.Increment(ref internalPendingBufferCount);
191 submittedBufferHandles.Enqueue(currentSubBufferHandles);
193 userBuffer.Offset += dataNeededToFillCurSubBuffer;
194 userBuffer.ByteCount -= dataNeededToFillCurSubBuffer;
195 dataNeededToFillCurSubBuffer = SubBufferSize;
196 currentSubBufferHandles =
new SubBufferDataHandles();
201 AudioTrackWrite(userBuffer.Buffer, userBuffer.Offset, userBuffer.ByteCount);
203 currentSubBufferHandles.AddHandle();
204 dataNeededToFillCurSubBuffer -= userBuffer.ByteCount;
206 if (dataNeededToFillCurSubBuffer == 0)
208 Interlocked.Increment(ref internalPendingBufferCount);
209 submittedBufferHandles.Enqueue(currentSubBufferHandles);
211 dataNeededToFillCurSubBuffer = SubBufferSize;
212 currentSubBufferHandles =
new SubBufferDataHandles();
216 pendingUserBuffers.Dequeue();
221 internal override void StopImpl()
227 private void ClearBuffersImpl()
236 pendingUserBuffers.Clear();
239 currentSubBufferHandles.FreeHandles();
245 internal override void CreateVoice(WaveFormat
format)
249 private void ResetBufferInfo()
251 currentSubBufferHandles =
new SubBufferDataHandles();
252 dataNeededToFillCurSubBuffer = SubBufferSize;
253 nbOfAudioFrameAvailable = 0;
256 internal override void PlatformSpecificDisposeImpl()
268 private class SubBufferDataHandles
270 public void FreeHandles()
275 public int HandleCount {
get;
private set; }
277 public void AddHandle()
279 HandleCount = HandleCount + 1;
SiliconStudio.Paradox.Graphics.Buffer Buffer
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format