189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef ANDROID_MEDIAPLAYERINTERFACE_H
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define ANDROID_MEDIAPLAYERINTERFACE_H
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifdef __cplusplus
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <sys/types.h>
2314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <utils/Errors.h>
242db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber#include <utils/KeyedVector.h>
252db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber#include <utils/String8.h>
262db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber#include <utils/RefBase.h>
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediaplayer.h>
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/AudioSystem.h>
30a64c8c79af1a15911c55306d83a797fa50969f77niko#include <media/Metadata.h>
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
32c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is
33c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman// global, and not in android::
34c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstruct sockaddr_in;
35c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
381d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniaclass Parcel;
395daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huberclass Surface;
401173118eace0e9e347cb007f0da817cee87579edGlenn Kastenclass ISurfaceTexture;
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
42d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cnikotemplate<typename T> class SortedVector;
431d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum player_type {
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    PV_PLAYER = 1,
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    SONIVOX_PLAYER = 2,
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    STAGEFRIGHT_PLAYER = 3,
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    NU_PLAYER = 4,
4914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    // Test players are available only in the 'test' and 'eng' builds.
5014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    // The shared library with the test player is passed passed as an
5114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    // argument to the 'test:' url in the setDataSource call.
5214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    TEST_PLAYER = 5,
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
551d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define DEFAULT_AUDIOSINK_BUFFERCOUNT 4
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define DEFAULT_AUDIOSINK_BUFFERSIZE 1200
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define DEFAULT_AUDIOSINK_SAMPLERATE 44100
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
60786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi// when the channel mask isn't known, use the channel count to derive a mask in AudioSink::open()
61786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi#define CHANNEL_MASK_USE_CHANNEL_ORDER 0
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
631948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent// duration below which we do not allow deep audio buffering
641948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000
651948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// callback mechanism for passing messages to MediaPlayer object
67b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangtypedef void (*notify_callback_f)(void* cookie,
68b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        int msg, int ext1, int ext2, const Parcel *obj);
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// abstract base class - use MediaPlayerInterface
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaPlayerBase : public RefBase
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // AudioSink: abstraction layer for audio output
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class AudioSink : public RefBase {
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public:
777d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber        // Callback returns the number of bytes actually written to the buffer.
787d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber        typedef size_t (*AudioCallback)(
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                AudioSink *audioSink, void *buffer, size_t size, void *cookie);
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual             ~AudioSink() {}
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual bool        ready() const = 0; // audio output is open and ready
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual bool        realtime() const = 0; // audio output is real-time output
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     bufferSize() const = 0;
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     frameCount() const = 0;
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     channelCount() const = 0;
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     frameSize() const = 0;
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual uint32_t    latency() const = 0;
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual float       msecsPerFrame() const = 0;
904110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen        virtual status_t    getPosition(uint32_t *position) const = 0;
914110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen        virtual status_t    getFramesWritten(uint32_t *frameswritten) const = 0;
924110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen        virtual int         getSessionId() const = 0;
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        // If no callback is specified, use the "write" API below to submit
957d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber        // audio data.
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        virtual status_t    open(
97786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi                uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
98e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten                audio_format_t format=AUDIO_FORMAT_PCM_16_BIT,
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                int bufferCount=DEFAULT_AUDIOSINK_BUFFERCOUNT,
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                AudioCallback cb = NULL,
1011948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                void *cookie = NULL,
1021948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE) = 0;
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        start() = 0;
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     write(const void* buffer, size_t size) = 0;
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        stop() = 0;
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        flush() = 0;
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        pause() = 0;
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        close() = 0;
1107a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi
1117a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        virtual status_t    setPlaybackRatePermille(int32_t rate) { return INVALID_OPERATION; }
1126b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        virtual bool        needsTrailingPadding() { return true; }
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        MediaPlayerBase() : mCookie(0), mNotify(0) {}
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual             ~MediaPlayerBase() {}
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    initCheck() = 0;
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        hardwareOutput() = 0;
1192db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
1209b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    virtual status_t    setUID(uid_t uid) {
1219b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        return INVALID_OPERATION;
1229b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    }
1239b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
1242db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    virtual status_t    setDataSource(
1252db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            const char *url,
1262db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            const KeyedVector<String8, String8> *headers = NULL) = 0;
1272db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    setDataSource(int fd, int64_t offset, int64_t length) = 0;
129e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
130e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual status_t    setDataSource(const sp<IStreamSource> &source) {
131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        return INVALID_OPERATION;
132e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
133e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
1341173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    // pass the buffered ISurfaceTexture to the media player service
1351173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    virtual status_t    setVideoSurfaceTexture(
1361173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                                const sp<ISurfaceTexture>& surfaceTexture) = 0;
1371173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    prepare() = 0;
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    prepareAsync() = 0;
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    start() = 0;
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    stop() = 0;
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    pause() = 0;
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        isPlaying() = 0;
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    seekTo(int msec) = 0;
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    getCurrentPosition(int *msec) = 0;
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    getDuration(int *msec) = 0;
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    reset() = 0;
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    setLooping(int loop) = 0;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual player_type playerType() = 0;
1504f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    virtual status_t    setParameter(int key, const Parcel &request) = 0;
1514f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    virtual status_t    getParameter(int key, Parcel *reply) = 0;
1524e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
1532e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman    // default no-op implementation of optional extensions
154c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    virtual status_t setRetransmitEndpoint(const struct sockaddr_in* endpoint) {
155c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return INVALID_OPERATION;
156c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
15744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual status_t getRetransmitEndpoint(struct sockaddr_in* endpoint) {
15844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return INVALID_OPERATION;
15944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
1602e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman    virtual status_t setNextPlayer(const sp<MediaPlayerBase>& next) {
1612e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman        return OK;
1622e5f22e85d177b34e790f832789d03aee438a7dbJohn Grossman    }
163c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
1641d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // Invoke a generic method on the player by using opaque parcels
1651d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // for the request and reply.
166d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    //
1671d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // @param request Parcel that is positioned at the start of the
1681d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    //                data sent by the java layer.
1691d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // @param[out] reply Parcel to hold the reply data. Cannot be null.
170d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @return OK if the call was successful.
1711d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    virtual status_t    invoke(const Parcel& request, Parcel *reply) = 0;
172d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko
173d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // The Client in the MetadataPlayerService calls this method on
174d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // the native player to retrieve all or a subset of metadata.
175d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    //
176d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @param ids SortedList of metadata ID to be fetch. If empty, all
177d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    //            the known metadata should be returned.
178d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @param[inout] records Parcel where the player appends its metadata.
179d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @return OK if the call was successful.
180a64c8c79af1a15911c55306d83a797fa50969f77niko    virtual status_t    getMetadata(const media::Metadata::Filter& ids,
181a64c8c79af1a15911c55306d83a797fa50969f77niko                                    Parcel *records) {
182a64c8c79af1a15911c55306d83a797fa50969f77niko        return INVALID_OPERATION;
183a64c8c79af1a15911c55306d83a797fa50969f77niko    };
184d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko
18501f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    void        setNotifyCallback(
18601f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber            void* cookie, notify_callback_f notifyFunc) {
18701f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber        Mutex::Autolock autoLock(mNotifyLock);
18801f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber        mCookie = cookie; mNotify = notifyFunc;
18901f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    }
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
191b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang    void        sendEvent(int msg, int ext1=0, int ext2=0,
192b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang                          const Parcel *obj=NULL) {
19301f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber        Mutex::Autolock autoLock(mNotifyLock);
194b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        if (mNotify) mNotify(mCookie, msg, ext1, ext2, obj);
19501f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    }
19601f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber
197a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    virtual status_t dump(int fd, const Vector<String16> &args) const {
198a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        return INVALID_OPERATION;
199a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
200a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
20101f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huberprivate:
20201f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    friend class MediaPlayerService;
20301f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber
20401f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    Mutex               mNotifyLock;
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void*               mCookie;
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    notify_callback_f   mNotify;
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Implement this class for media players that use the AudioFlinger software mixer
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaPlayerInterface : public MediaPlayerBase
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual             ~MediaPlayerInterface() { }
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        hardwareOutput() { return false; }
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void        setAudioSink(const sp<AudioSink>& audioSink) { mAudioSink = audioSink; }
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprotected:
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<AudioSink>       mAudioSink;
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2201173118eace0e9e347cb007f0da817cee87579edGlenn Kasten// Implement this class for media players that output audio directly to hardware
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaPlayerHWInterface : public MediaPlayerBase
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual             ~MediaPlayerHWInterface() {}
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        hardwareOutput() { return true; }
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    setVolume(float leftVolume, float rightVolume) = 0;
227fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t    setAudioStreamType(audio_stream_type_t streamType) = 0;
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // __cplusplus
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_MEDIAPLAYERINTERFACE_H
236