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(); } }
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; } } }