MeidaPlayer的接口和架构分析

    技术2022-05-14  3

    MeidaPlayer.h

    MediaPlayerListener::notify用来通知client,反馈server发生的情况,使client做出相应的反应。

    主要定义了一个播放器状态机。

     

    //播放器状态机

    class MediaPlayer : public BnMediaPlayerClient,

                        public virtual IMediaDeathNotifier

    {

    public:

        MediaPlayer();

        ~MediaPlayer();

                void            died();

                void            disconnect();

     

                status_t        setDataSource(

                        const char *url,

                        const KeyedVector<String8, String8> *headers);

     

                status_t        setDataSource(int fd, int64_t offset, int64_t length);

                status_t        setVideoSurface(const sp<Surface>& surface);

                status_t        setListener(const sp<MediaPlayerListener>& listener);

                status_t        prepare();

                status_t        prepareAsync();

                status_t        start();

                status_t        stop();

                status_t        pause();

                bool            isPlaying();

                status_t        getVideoWidth(int *w);

                status_t        getVideoHeight(int *h);

                status_t        seekTo(int msec);

                status_t        getCurrentPosition(int *msec);

                status_t        getDuration(int *msec);

                status_t        reset();

                status_t        setAudioStreamType(int type);

                status_t        setLooping(int loop);

                bool            isLooping();

                status_t        setVolume(float leftVolume, float rightVolume);

                void            notify(int msg, int ext1, int ext2);

        static  sp<IMemory>     decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);

        static  sp<IMemory>     decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);

                status_t        invoke(const Parcel& request, Parcel *reply);

                status_t        setMetadataFilter(const Parcel& filter);

                status_t        getMetadata(bool update_only, bool apply_filter, Parcel *metadata);

                status_t        suspend();

                status_t        resume();

                status_t        setAudioSessionId(int sessionId);

                int             getAudioSessionId();

                status_t        setAuxEffectSendLevel(float level);

                status_t        attachAuxEffect(int effectId);

    private:

                void            clear_l();

                status_t        seekTo_l(int msec);

                status_t        prepareAsync_l();

                status_t        getDuration_l(int *msec);

                status_t        setDataSource(const sp<IMediaPlayer>& player);

     

        sp<IMediaPlayer>            mPlayer;

        thread_id_t                 mLockThreadId;

        Mutex                       mLock;

        Mutex                       mNotifyLock;

        Condition                   mSignal;

        sp<MediaPlayerListener>     mListener;

        void*                       mCookie;

        media_player_states         mCurrentState;

        int                         mDuration;

        int                         mCurrentPosition;

        int                         mSeekPosition;

        bool                        mPrepareSync;

        status_t                    mPrepareStatus;

        int                         mStreamType;

        bool                        mLoop;

        float                       mLeftVolume;

        float                       mRightVolume;

        int                         mVideoWidth;

        int                         mVideoHeight;

        int                         mAudioSessionId;

        float                       mSendLevel;

    };

     

     

     


    最新回复(0)