RxAndroidAudio icon indicating copy to clipboard operation
RxAndroidAudio copied to clipboard

How to get player progress

Open CallumCoombes opened this issue 7 years ago • 4 comments

How do I get the player progress to display it in a seekbar? The MediaPlayer is always null for me.

CallumCoombes avatar Jan 04 '18 13:01 CallumCoombes

Could you please debug why do you always get null?

Piasy avatar Jan 04 '18 14:01 Piasy

        rxAudioPlayer = RxAudioPlayer.getInstance();
        rxAudioPlayer.play(PlayConfig.file(audioFile).looping(false).build())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<Boolean>() {
                    @Override
                    public void onSubscribe(final Disposable disposable) {
                        Log.d("MEDIA", "onSubscribe");
                    }

                    @Override
                    public void onNext(final Boolean aBoolean) {
                        // prepared
                        Log.d("MEDIA", "onNext");
                    }

                    @Override
                    public void onError(final Throwable throwable) {
                        Log.d("MEDIA", "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.d("MEDIA", "onComplete");
                        // play finished
                        // NOTE: if looping, the Observable will never finish, you need stop playing
                        // onDestroy, otherwise, memory leak will happen!
                    }
                });

MediaPlayer is null in onNext, surely here it should have been prepared?

CallumCoombes avatar Jan 04 '18 14:01 CallumCoombes

Actually not, here is code:

    /**
     * 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();
            }
            emitter.onNext(true);

            player.start();
            mPlayer = player;
        }).doOnError(e -> stopPlay());
    }

To fix this problem, we can move mPlayer = player before emit onNext, PR is welcome!

Piasy avatar Jan 04 '18 14:01 Piasy

Yeah just saw that. Was it just left there from the PR that exposed the MediaPlayer? Cheers

CallumCoombes avatar Jan 04 '18 14:01 CallumCoombes