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);
        }
Beispiel #2
0
        /// <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
        }