Пример #1
0
    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();
    }
Пример #2
0
    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();
    }
Пример #3
0
    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);
            }
        }
Пример #5
0
        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;
            });
        }
Пример #7
0
        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();
            }
        }