MediaPlayerService.h revision dac6a31a33ba53fb93850670cdddd1e6515dadce
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2008, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_MEDIAPLAYERSERVICE_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_MEDIAPLAYERSERVICE_H
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
212269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn#include <utils/Log.h>
222269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn#include <utils/threads.h>
232269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn#include <utils/List.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/KeyedVector.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/SurfaceComposerClient.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IMediaPlayerService.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/MediaPlayerInterface.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/Metadata.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass IMediaRecorder;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass IMediaMetadataRetriever;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass IOMX;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MediaRecorderClient;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define CALLBACK_ANTAGONIZER 0
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if CALLBACK_ANTAGONIZER
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Antagonizer {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Antagonizer(notify_callback_f cb, void* client);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void start() { mActive = true; }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void stop() { mActive = false; }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void kill();
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const int interval;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Antagonizer();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int callbackThread(void* cookie);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex               mLock;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Condition           mCondition;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool                mExit;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool                mActive;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void*               mClient;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    notify_callback_f   mCb;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MediaPlayerService : public BnMediaPlayerService
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Client;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class AudioOutput : public MediaPlayerBase::AudioSink
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                AudioOutput();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual                 ~AudioOutput();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual bool            ready() const { return mTrack != NULL; }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual bool            realtime() const { return true; }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         bufferSize() const;
74a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual ssize_t         frameCount() const;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         channelCount() const;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         frameSize() const;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual uint32_t        latency() const;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual float           msecsPerFrame() const;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        open(
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uint32_t sampleRate, int channelCount,
82a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani                int format, int bufferCount,
83a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani                AudioCallback cb, void *cookie);
84a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani
85a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual void            start();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         write(const void* buffer, size_t size);
87a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual void            stop();
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            flush();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            pause();
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            close();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void            setAudioStreamType(int streamType) { mStreamType = streamType; }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void            setVolume(float left, float right);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        dump(int fd, const Vector<String16>& args) const;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static bool             isOnEmulator();
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static int              getMinBufferCount();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static void             setMinBufferCount();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static void             CallbackWrapper(
100a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani                int event, void *me, void *info);
101a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani
102a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        AudioTrack*             mTrack;
103a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        AudioCallback           mCallback;
104a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        void *                  mCallbackCookie;
105a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        int                     mStreamType;
106a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        float                   mLeftVolume;
107a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        float                   mRightVolume;
108a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        float                   mMsecsPerFrame;
109a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        uint32_t                mLatency;
110a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani
111a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        // TODO: Find real cause of Audio/Video delay in PV framework and remove this workaround
112a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        static const uint32_t   kAudioVideoDelayMs;
113a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        static bool             mIsOnEmulator;
114a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        static int              mMinBufferCount;  // 12 for emulator; otherwise 4
115a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani
116a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        public: // visualization hack support
117a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        uint32_t                mNumFramesWritten;
118a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani    };
119a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani
120a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani    class AudioCache : public MediaPlayerBase::AudioSink
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
122a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani    public:
123a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani                                AudioCache(const char* name);
124a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual                 ~AudioCache() {}
125a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani
126a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); }
127a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual bool            realtime() const { return false; }
128a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; }
129a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual ssize_t         frameCount() const { return mFrameCount; }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         frameSize() const { return ssize_t(mChannelCount * ((mFormat == AudioSystem::PCM_16_BIT)?sizeof(int16_t):sizeof(u_int8_t))); }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual uint32_t        latency() const;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual float           msecsPerFrame() const;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        open(
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uint32_t sampleRate, int channelCount, int format,
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int bufferCount = 1,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioCallback cb = NULL, void *cookie = NULL);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            start() {}
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ssize_t         write(const void* buffer, size_t size);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            stop() {}
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            flush() {}
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            pause() {}
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            close() {}
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void            setAudioStreamType(int streamType) {}
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void            setVolume(float left, float right) {}
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uint32_t        sampleRate() const { return mSampleRate; }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                uint32_t        format() const { return (uint32_t)mFormat; }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                size_t          size() const { return mSize; }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t        wait();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp<IMemoryHeap> getHeap() const { return mHeap; }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static  void            notify(void* cookie, int msg, int ext1, int ext2);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        dump(int fd, const Vector<String16>& args) const;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                AudioCache();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Mutex               mLock;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Condition           mSignal;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MemoryHeapBase>  mHeap;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float               mMsecsPerFrame;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint16_t            mChannelCount;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint16_t            mFormat;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t             mFrameCount;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t            mSampleRate;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t            mSize;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                 mError;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool                mCommandComplete;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static  void                instantiate();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IMediaPlayerService interface
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMediaRecorder>  createMediaRecorder(pid_t pid);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void    removeMediaRecorderClient(wp<MediaRecorderClient> client);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // House keeping for media player clients
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMediaPlayer>    create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemory>         decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemory>         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IMemory>         snoop();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IOMX>            createOMX();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t            dump(int fd, const Vector<String16>& args);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                removeClient(wp<Client> client);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Client : public BnMediaPlayer {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // IMediaPlayer interface
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void            disconnect();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        setVideoSurface(const sp<ISurface>& surface);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        prepareAsync();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        start();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        stop();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        pause();
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        isPlaying(bool* state);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        seekTo(int msec);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        getCurrentPosition(int* msec);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        getDuration(int* msec);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        reset();
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        setAudioStreamType(int type);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        setLooping(int loop);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        setVolume(float leftVolume, float rightVolume);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        invoke(const Parcel& request, Parcel *reply);
215a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual status_t        setMetadataFilter(const Parcel& filter);
216a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani        virtual status_t        getMetadata(bool update_only,
217a565e5e3d084c4e5a21a094b1409e3b23f9dce48Amith Yamasani                                            bool apply_filter,
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            Parcel *reply);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MediaPlayerBase>     createPlayer(player_type playerType);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t        setDataSource(const char *url);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t        setDataSource(int fd, int64_t offset, int64_t length);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static  void            notify(void* cookie, int msg, int ext1, int ext2);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pid_t           pid() const { return mPid; }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t        dump(int fd, const Vector<String16>& args) const;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class MediaPlayerService;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Client( const sp<MediaPlayerService>& service,
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        pid_t pid,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int32_t connId,
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMediaPlayerClient>& client);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Client();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual                 ~Client();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void            deletePlayer();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // @param type Of the metadata to be tested.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // @return true if the metadata should be dropped according to
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //              the filters.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool shouldDropMetadata(media::Metadata::Type type) const;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add a new element to the set of metadata updated. Noop if
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the element exists already.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // @param type Of the metadata to be recorded.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void addNewMetadataUpdate(media::Metadata::Type type);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mutable     Mutex                       mLock;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<MediaPlayerBase>         mPlayer;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<MediaPlayerService>      mService;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<IMediaPlayerClient>      mClient;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<AudioOutput>             mAudioOutput;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pid_t                       mPid;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    status_t                    mStatus;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool                        mLoop;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int32_t                     mConnId;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Metadata filters.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        media::Metadata::Filter mMetadataAllow;  // protected by mLock
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        media::Metadata::Filter mMetadataDrop;  // protected by mLock
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // notification we try to update mMetadataUpdated which is a
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // set: no duplicate.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // getMetadata clears this set.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        media::Metadata::Filter mMetadataUpdated;  // protected by mLock
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if CALLBACK_ANTAGONIZER
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Antagonizer*                mAntagonizer;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
280                            MediaPlayerService();
281    virtual                 ~MediaPlayerService();
282
283    mutable     Mutex                       mLock;
284                SortedVector< wp<Client> >  mClients;
285                SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
286                int32_t                     mNextConnId;
287};
288
289// ----------------------------------------------------------------------------
290
291}; // namespace android
292
293#endif // ANDROID_MEDIAPLAYERSERVICE_H
294