private AudioTrack GetAudioTrack() { ChannelOut channelOut = _channels == 2 ? ChannelOut.Stereo : ChannelOut.Mono; Encoding encoding = Encoding.Pcm16bit;; int bufferSize = AudioTrack.GetMinBufferSize(_sampleRate, channelOut, encoding) * 2; AudioTrack audioTrack; AudioAttributes.Builder attributesBuilder = new AudioAttributes.Builder() .SetUsage(AudioUsageKind.Game); AudioFormat format = new AudioFormat.Builder() .SetEncoding(encoding) .SetSampleRate(_sampleRate) .SetChannelMask(channelOut) .Build(); if (Build.VERSION.SdkInt < BuildVersionCodes.O) { attributesBuilder.SetFlags(AudioFlags.LowLatency); } if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { AudioTrack.Builder trackBuilder = new AudioTrack.Builder() .SetAudioFormat(format) .SetAudioAttributes(attributesBuilder.Build()) .SetTransferMode(AudioTrackMode.Stream) .SetBufferSizeInBytes(bufferSize); trackBuilder.SetPerformanceMode(AudioTrackPerformanceMode.LowLatency); audioTrack = trackBuilder.Build(); } else { audioTrack = new AudioTrack(attributesBuilder.Build(), format, bufferSize, AudioTrackMode.Stream, AudioManager.AudioSessionIdGenerate); } return(audioTrack); }
/// <summary> /// Replays recorded audio by microphone. /// </summary> /// <param name="UIDispatcher">UIDispatcher needed for UWP platform.</param> public async void ReplayRecording(CoreDispatcher UIDispatcher) { #region UWP #if NETFX_CORE // Do nothign without buffer if (buffer == null) { return; } MediaElement playback = new MediaElement(); IRandomAccessStream audioBuffer; lock (bufferLock) { audioBuffer = buffer.CloneStream(); } if (audioBuffer == null) { throw new ArgumentNullException("buffer"); } // Replay async await UIDispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => { playback.SetSource(audioBuffer, ""); playback.Play(); }); #endif #endregion #region ANDROID #if __ANDROID__ // Setup AudioTrack ChannelOut channels = Parameters.Channels == 1 ? ChannelOut.Mono : ChannelOut.Stereo; AudioTrack audioTrack = new AudioTrack.Builder() .SetAudioAttributes(new AudioAttributes.Builder() .SetUsage(AudioUsageKind.Media) .SetContentType(AudioContentType.Music) .Build()) .SetAudioFormat(new AudioFormat.Builder() .SetEncoding(Encoding.Pcm16bit) .SetSampleRate((int)Parameters.SamplingRate) .SetChannelMask(channels) .Build()) .SetBufferSizeInBytes(buffer.Length) .Build(); int totalBytesReplayed = 0; // Replay audio in lock until whole buffer is replayed lock (bufferLock) { audioTrack.Play(); while (totalBytesReplayed < bufferLimit) { try { totalBytesReplayed = audioTrack.Write(buffer, 0, bufferLimit); System.Diagnostics.Debug.WriteLine($"Read: {totalBytesReplayed}"); if (totalBytesReplayed < 0) { throw new Exception(String.Format("Exception code: {0}", totalBytesReplayed)); } } catch (Exception e) { // Invalidate audio buffer buffer = null; break; } } } #endif #endregion }