예제 #1
0
    public void start(string codec)
    {
        if (running)
        {
            Logging.warn("Audio recorder is already running.");
            return;
        }
        running = true;

        AudioManager am = (AudioManager)MainActivity.Instance.GetSystemService(Context.AudioService);

        if (Build.VERSION.SdkInt < BuildVersionCodes.O)
        {
            focusListener = new AudioFocusListener();
#pragma warning disable CS0618 // Type or member is obsolete
            am.RequestAudioFocus(focusListener, Stream.VoiceCall, AudioFocus.GainTransient);
#pragma warning restore CS0618 // Type or member is obsolete
        }
        else
        {
            AudioAttributes aa = new AudioAttributes.Builder()
                                 .SetContentType(AudioContentType.Speech)
                                 .SetFlags(AudioFlags.LowLatency)
                                 .SetUsage(AudioUsageKind.VoiceCommunication)
                                 .Build();

            focusListener = new AudioFocusListener();

            focusRequest = new AudioFocusRequestClass.Builder(AudioFocus.GainTransient)
                           .SetAudioAttributes(aa)
                           .SetFocusGain(AudioFocus.GainTransient)
                           .SetOnAudioFocusChangeListener(focusListener)
                           .Build();
            am.RequestAudioFocus(focusRequest);
        }

        lock (outputBuffers)
        {
            outputBuffers.Clear();
        }

        bufferSize = AudioTrack.GetMinBufferSize(sampleRate, ChannelOut.Mono, Encoding.Pcm16bit);

        initEncoder(codec);
        initRecorder();

        recordThread = new Thread(recordLoop);
        recordThread.Start();

        senderThread = new Thread(senderLoop);
        senderThread.Start();
    }
        public AudioFocusManager(IMediaPlayer <SimpleExoPlayer> player)
        {
            this.mediaPlayer = player;
            context          = global::Android.App.Application.Context;
            mAudioManager    = (AudioManager)context.GetSystemService(Context.AudioService);

            mAudioAttributes = new AudioAttributes.Builder()
                               .SetUsage(AudioUsageKind.Media)
                               .SetContentType(AudioContentType.Music)
                               .Build();

            mFocusListener = new AudioFocusListener
            {
                OnAudioFocusChangeImpl = (focusChange) =>
                {
                    switch (focusChange)
                    {
                    case AudioFocus.Gain:
                        if (ShouldPlayWhenReady && !IsPlaying())
                        {
                            exoPlayer.PlayWhenReady = true;     //play.
                        }
                        else if (IsPlaying())
                        {
                            exoPlayer.Volume = MEDIA_VOLUME_DEFAULT;
                        }

                        ShouldPlayWhenReady = false;
                        break;

                    case AudioFocus.LossTransientCanDuck:
                        exoPlayer.Volume = MEDIA_VOLUME_DUCK;
                        break;

                    case AudioFocus.LossTransient:
                        if (IsPlaying())
                        {
                            ShouldPlayWhenReady = true;

                            exoPlayer.PlayWhenReady = false;     //pause.
                        }
                        break;

                    case AudioFocus.Loss:
                        AbandonAudioFocus();
                        ShouldPlayWhenReady = false;
                        break;
                    }
                }
            };

            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                mAudioFocusRequest = new AudioFocusRequestClass
                                     .Builder(AudioFocus.Gain)
                                     .SetAudioAttributes(mAudioAttributes)
                                     .SetAcceptsDelayedFocusGain(true)
                                     .SetOnAudioFocusChangeListener(mFocusListener)
                                     .Build();
            }
        }
예제 #3
0
    public void stop()
    {
        if (!running)
        {
            return;
        }
        running = false;

        if (echoCanceller != null)
        {
            try
            {
                echoCanceller.Release();
                echoCanceller.Dispose();
            }
            catch (Exception)
            {
            }
            echoCanceller = null;
        }

        if (noiseSuppressor != null)
        {
            try
            {
                noiseSuppressor.Release();
                noiseSuppressor.Dispose();
            }
            catch (Exception)
            {
            }
            noiseSuppressor = null;
        }

        if (audioRecorder != null)
        {
            try
            {
                audioRecorder.Stop();
                audioRecorder.Release();
            }
            catch (Exception)
            {
            }
            audioRecorder.Dispose();
            audioRecorder = null;
        }

        if (audioEncoder != null)
        {
            audioEncoder.stop();
            audioEncoder.Dispose();
            audioEncoder = null;
        }

        buffer       = null;
        shortsBuffer = null;
        bufferSize   = 0;
        lock (outputBuffers)
        {
            outputBuffers.Clear();
        }


        AudioManager am = (AudioManager)MainActivity.Instance.GetSystemService(Context.AudioService);

        if (Build.VERSION.SdkInt < BuildVersionCodes.O)
        {
            if (focusListener != null)
            {
#pragma warning disable CS0618 // Type or member is obsolete
                am.AbandonAudioFocus(focusListener);
#pragma warning restore CS0618 // Type or member is obsolete
                focusListener.Dispose();
                focusListener = null;
            }
        }
        else
        {
            if (focusListener != null)
            {
                if (focusRequest != null)
                {
                    am.AbandonAudioFocusRequest(focusRequest);
                    focusRequest.Dispose();
                    focusRequest = null;
                }
                focusListener.Dispose();
                focusListener = null;
            }
        }
    }