public void start() { if (running) { Logging.warn("Audio player is already running."); return; } running = true; AudioAttributes aa = new AudioAttributes.Builder() .SetContentType(AudioContentType.Speech) .SetLegacyStreamType(Stream.VoiceCall) .SetFlags(AudioFlags.LowLatency) .SetUsage(AudioUsageKind.VoiceCommunication) .Build(); AudioFormat af = new AudioFormat.Builder() .SetSampleRate(44100) .SetChannelMask(ChannelOut.Mono) .SetEncoding(Encoding.Pcm16bit) .Build(); audioPlayer = new AudioTrack(aa, af, AudioTrack.GetMinBufferSize(44100, ChannelOut.Mono, Encoding.Pcm16bit) * 100, AudioTrackMode.Stream, 0); audioPlayer.SetVolume(0.8f); audioPlayer.Play(); }
private void initPlayer() { Encoding encoding = Encoding.Pcm16bit; bufferSize = AudioTrack.GetMinBufferSize(sampleRate, ChannelOut.Mono, encoding); Logging.info("Min. buffer size " + bufferSize); int new_buffer_size = CodecTools.getPcmFrameByteSize(sampleRate, bitRate, channels) * 100; if (bufferSize < new_buffer_size) { bufferSize = (int)(Math.Ceiling((decimal)new_buffer_size / bufferSize) * bufferSize); } Logging.info("Final buffer size " + bufferSize); // Prepare player AudioAttributes aa = new AudioAttributes.Builder() .SetContentType(AudioContentType.Speech) .SetFlags(AudioFlags.LowLatency) .SetUsage(AudioUsageKind.VoiceCommunication) .Build(); AudioFormat af = new AudioFormat.Builder() .SetSampleRate(sampleRate) .SetChannelMask(ChannelOut.Mono) .SetEncoding(encoding) .Build(); audioPlayer = new AudioTrack(aa, af, bufferSize, AudioTrackMode.Stream, 0); MainActivity.Instance.VolumeControlStream = Stream.VoiceCall; audioPlayer.Play(); }
private void initPlayer() { Encoding encoding = Encoding.Pcm16bit; // Prepare player AudioAttributes aa = new AudioAttributes.Builder() .SetContentType(AudioContentType.Speech) .SetLegacyStreamType(Stream.VoiceCall) .SetFlags(AudioFlags.LowLatency) .SetUsage(AudioUsageKind.VoiceCommunication) .Build(); AudioFormat af = new AudioFormat.Builder() .SetSampleRate(44100) .SetChannelMask(ChannelOut.Mono) .SetEncoding(encoding) .Build(); bufferSize = AudioTrack.GetMinBufferSize(44100, ChannelOut.Mono, encoding) * 10; audioPlayer = new AudioTrack(aa, af, bufferSize, AudioTrackMode.Stream, 0); // TODO implement dynamic volume control AudioManager am = (AudioManager)MainActivity.Instance.GetSystemService(Context.AudioService); audioPlayer.SetVolume(am.GetStreamVolume(Stream.VoiceCall)); audioPlayer.Play(); }
//public void Write(byte[] bytes) //{ // /* // foreach(System.IO.Stream temp in streamList) // { // try // { // temp.Write(bytes); // } // catch (System.IO.IOException ex) // { // System.Diagnostics.Debug.WriteLine("Error occurred when sending data", ex); // } // } // * // */ // try // { // mmOutStream.Write(bytes); // } // catch (System.IO.IOException ex) // { // System.Diagnostics.Debug.WriteLine("Error occurred when sending data", ex); // } //} public void Write(System.IO.Stream stream) { /* * foreach(System.IO.Stream temp in streamList) * { * try * { * temp.Write(bytes); * } * catch (System.IO.IOException ex) * { * System.Diagnostics.Debug.WriteLine("Error occurred when sending data", ex); * } * } * */ AudioTrack _output; int buffsize = AudioTrack.GetMinBufferSize(44100, ChannelOut.Stereo, Android.Media.Encoding.Pcm16bit); //_output = new AudioTrack(Android.Media.Stream.Music, 44100, ChannelOut.Stereo, Android.Media.Encoding.Pcm16bit, //buffsize, AudioTrackMode.Stream); var AABuilder = new AudioAttributes.Builder(); AABuilder.SetContentType(AudioContentType.Music); AABuilder.SetUsage(AudioUsageKind.Media); var AfBuilder = new AudioFormat.Builder(); AfBuilder.SetSampleRate(44100); AfBuilder.SetEncoding(Android.Media.Encoding.Pcm16bit); AfBuilder.SetChannelMask(ChannelOut.Stereo); _output = new AudioTrack(AABuilder.Build(), AfBuilder.Build(), buffsize, AudioTrackMode.Stream, AudioManager.AudioSessionIdGenerate); _output.Play(); try { byte[] buffer = new byte[1000]; int bytesReturned = 1; while (bytesReturned > 0) { bytesReturned = stream.Read(buffer, 0, buffer.Length); mmOutStream.Write(buffer); _output.Write(buffer, 0, buffer.Length); //DependencyService.Get<BluetoothManager>().Write(buffer); } stream.Close(); } catch (System.IO.IOException ex) { System.Diagnostics.Debug.WriteLine("Error occurred when sending data", ex); } }
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); }
public void Read() { System.Threading.Tasks.Task.Run(() => { AudioTrack _output; int buffsize = AudioTrack.GetMinBufferSize(44100, ChannelOut.Stereo, Android.Media.Encoding.Pcm16bit); //_output = new AudioTrack(Android.Media.Stream.Music, 44100, ChannelOut.Stereo, Android.Media.Encoding.Pcm16bit, //buffsize, AudioTrackMode.Stream); var AABuilder = new AudioAttributes.Builder(); AABuilder.SetContentType(AudioContentType.Music); AABuilder.SetUsage(AudioUsageKind.Media); var AfBuilder = new AudioFormat.Builder(); AfBuilder.SetSampleRate(44100); AfBuilder.SetEncoding(Android.Media.Encoding.Pcm16bit); AfBuilder.SetChannelMask(ChannelOut.Stereo); _output = new AudioTrack(AABuilder.Build(), AfBuilder.Build(), buffsize, AudioTrackMode.Stream, AudioManager.AudioSessionIdGenerate); _output.Play(); byte[] myReadBuffer = new byte[1000]; int count = 4; System.Threading.Tasks.Task.Run(() => { while (true) { try { int a = mmInStream.Read(myReadBuffer, 0, myReadBuffer.Length); if (a > 0) { if (count == 0) { _output.Write(myReadBuffer, 0, myReadBuffer.Length); } else { count--; } } else { var t = a; } } catch (System.IO.IOException ex) { System.Diagnostics.Debug.WriteLine("Input stream was disconnected", ex); } } }).ContinueWith((t) => { var a = t.Exception; }); }).ContinueWith((t) => { var a = t.Exception; }); }
private void _Start(string host, int port, EBroadcastMode broadcastMode) { try { if (m_Running) { return; } Android.OS.Process.SetThreadPriority(ThreadPriority.UrgentAudio); PowerManager powerManager = (PowerManager)GetSystemService(PowerService); m_WakeLock = powerManager.NewWakeLock(WakeLockFlags.Partial, "snapdotnet:SnapcastPartialWakeLock"); m_WakeLock.Acquire(); WifiManager wifiManager = (WifiManager)GetSystemService(WifiService); m_WifiLock = wifiManager.CreateWifiLock(WifiMode.FullHighPerf, "snapdotnet:SnapcastWifiWakeLock"); m_WifiLock.Acquire(); m_Host = host; m_Port = port; m_BroadcastMode = broadcastMode; // actually connect here and start audio loop AudioPlaybackCaptureConfiguration config = new AudioPlaybackCaptureConfiguration.Builder(m_MediaProjection) .AddMatchingUsage(AudioUsageKind.Media) .Build(); AudioFormat audioFormat = new AudioFormat.Builder() .SetEncoding(Encoding.Pcm16bit) .SetSampleRate(48000) .SetChannelMask(ChannelOut.Stereo).Build(); AudioRecord.Builder builder = new AudioRecord.Builder() .SetAudioFormat(audioFormat) .SetBufferSizeInBytes(2048); if (m_BroadcastMode == EBroadcastMode.Media) { builder.SetAudioPlaybackCaptureConfig(config); } if (m_BroadcastMode == EBroadcastMode.Microphone) { builder.SetAudioSource(AudioSource.Mic); } m_AudioRecord = builder.Build(); m_ConnectionThread = new Thread(() => { m_ClientConnection = new ClientConnection(m_Host, m_Port); m_ClientConnection.OnConnected += _OnClientConnectionConnected; m_ClientConnection.Connect(); }); m_ConnectionThread.Start(); m_Running = true; if (m_SnapclientListener != null) { m_SnapclientListener.OnBroadcastStateChanged(this); } } catch (Exception e) { e.PrintStackTrace(); if (m_SnapclientListener != null) { m_SnapclientListener.OnError(this, e.Message, e); } _Stop(); } }