public PlayConfig build() { return new PlayConfig(this); } }
/** * prepare audio from local file. should be scheduled in IO thread. */ public Observable<Boolean> prepare(@NonNull final PlayConfig config) { if (!config.isArgumentValid() || !config.isLocalSource()) { return Observable.error(new IllegalArgumentException("")); } return Observable.<Boolean>create(emitter -> { MediaPlayer player = create(config); setMediaPlayerListener(player, emitter); player.setVolume(config.mLeftVolume, config.mRightVolume); player.setAudioStreamType(config.mStreamType); player.setLooping(config.mLooping); if (config.needPrepare()) { player.prepare(); } mPlayer = player; emitter.onNext(true); }).doOnError(e -> stopPlay()); }
/** * Non reactive API. */ @WorkerThread public boolean playNonRxy(@NonNull final PlayConfig config, final MediaPlayer.OnCompletionListener onCompletionListener, final MediaPlayer.OnErrorListener onErrorListener) { if (!config.isArgumentValid()) { return false; } try { MediaPlayer player = create(config); setMediaPlayerListener(player, onCompletionListener, onErrorListener); player.setVolume(config.mLeftVolume, config.mRightVolume); player.setAudioStreamType(config.mStreamType); player.setLooping(config.mLooping); if (config.needPrepare()) { player.prepare(); } player.start(); mPlayer = player; return true; } catch (RuntimeException | IOException e) { Log.w(TAG, "startPlay fail, IllegalArgumentException: " + e.getMessage()); stopPlay(); return false; } }
@OnClick(R.id.mBtnPlay) public void startPlay() { mTvLog.setText(""); if (!mAudioFiles.isEmpty()) { File audioFile = mAudioFiles.poll(); compositeDisposable.add(mRxAudioPlayer.play( PlayConfig.file(audioFile) .streamType(AudioManager.STREAM_VOICE_CALL) .build()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(Functions.emptyConsumer(), Throwable::printStackTrace, this::startPlay)); } }
Log.d(TAG, "to play audio_record_ready: " + R.raw.audio_record_ready); return mRxAudioPlayer.play( PlayConfig.res(getApplicationContext(), R.raw.audio_record_ready) .build()); })
/** * play audio from local file. should be scheduled in IO thread. */ public Observable<Boolean> play(@NonNull final PlayConfig config) { if (!config.isArgumentValid()) { return Observable.error(new IllegalArgumentException("")); } return Observable.<Boolean>create(emitter -> { MediaPlayer player = create(config); setMediaPlayerListener(player, emitter); player.setVolume(config.mLeftVolume, config.mRightVolume); player.setAudioStreamType(config.mStreamType); player.setLooping(config.mLooping); if (config.needPrepare()) { player.prepare(); } player.start(); mPlayer = player; emitter.onNext(true); }).doOnError(e -> stopPlay()); }