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>
293a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AudioResamplerPublic.h>
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/AudioSystem.h>
3106ad1528e6dd4c866c085d3cad9235d2752eb3edLajos Molnar#include <media/AudioTimestamp.h>
323a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar#include <media/AVSyncSettings.h>
33a64c8c79af1a15911c55306d83a797fa50969f77niko#include <media/Metadata.h>
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
35c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is
36c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman// global, and not in android::
37c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossmanstruct sockaddr_in;
38c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsclass DataSource;
421d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Cataniaclass Parcel;
435daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huberclass Surface;
44484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFaddenclass IGraphicBufferProducer;
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
46d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cnikotemplate<typename T> class SortedVector;
471d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum player_type {
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    STAGEFRIGHT_PLAYER = 3,
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    NU_PLAYER = 4,
5114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    // Test players are available only in the 'test' and 'eng' builds.
5214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    // The shared library with the test player is passed passed as an
5314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    // argument to the 'test:' url in the setDataSource call.
5414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania    TEST_PLAYER = 5,
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
571d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define DEFAULT_AUDIOSINK_BUFFERCOUNT 4
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define DEFAULT_AUDIOSINK_BUFFERSIZE 1200
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define DEFAULT_AUDIOSINK_SAMPLERATE 44100
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi// when the channel mask isn't known, use the channel count to derive a mask in AudioSink::open()
63786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi#define CHANNEL_MASK_USE_CHANNEL_ORDER 0
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
651948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent// duration below which we do not allow deep audio buffering
661948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000
671948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// callback mechanism for passing messages to MediaPlayer object
69b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wangtypedef void (*notify_callback_f)(void* cookie,
70b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang        int msg, int ext1, int ext2, const Parcel *obj);
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// abstract base class - use MediaPlayerInterface
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaPlayerBase : public RefBase
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // AudioSink: abstraction layer for audio output
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class AudioSink : public RefBase {
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    public:
79ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        enum cb_event_t {
80ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            CB_EVENT_FILL_BUFFER,   // Request to write more data to buffer.
81ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            CB_EVENT_STREAM_END,    // Sent after all the buffers queued in AF and HW are played
82ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                    // back (after stop is called)
83ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald            CB_EVENT_TEAR_DOWN      // The AudioTrack was invalidated due to use case change:
84ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                                    // Need to re-evaluate offloading options
85ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald        };
86ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
877d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber        // Callback returns the number of bytes actually written to the buffer.
887d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber        typedef size_t (*AudioCallback)(
89ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                AudioSink *audioSink, void *buffer, size_t size, void *cookie,
90ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                        cb_event_t event);
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual             ~AudioSink() {}
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual bool        ready() const = 0; // audio output is open and ready
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     bufferSize() const = 0;
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     frameCount() const = 0;
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     channelCount() const = 0;
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual ssize_t     frameSize() const = 0;
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual uint32_t    latency() const = 0;
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual float       msecsPerFrame() const = 0;
1004110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen        virtual status_t    getPosition(uint32_t *position) const = 0;
10106ad1528e6dd4c866c085d3cad9235d2752eb3edLajos Molnar        virtual status_t    getTimestamp(AudioTimestamp &ts) const = 0;
102c4ac8173f911aeac8d5006b19ba48fb51a865115Wei Jia        virtual int64_t     getPlayedOutDurationUs(int64_t nowUs) const = 0;
1034110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen        virtual status_t    getFramesWritten(uint32_t *frameswritten) const = 0;
104d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten        virtual audio_session_t getSessionId() const = 0;
10522612345ae97648d5b6db43cc1aa30aad77f7bbaEric Laurent        virtual audio_stream_type_t getAudioStreamType() const = 0;
1066f59db12a64f4496866952a251122ccb77a36c6bEric Laurent        virtual uint32_t    getSampleRate() const = 0;
107f2c87b3f88d987d2af6322e9763eb8224a2bae48Andy Hung        virtual int64_t     getBufferDurationInUs() const = 0;
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        // If no callback is specified, use the "write" API below to submit
1107d5b8a70c28c0d5746a600467b2887822dbff88eAndreas Huber        // audio data.
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        virtual status_t    open(
112786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi                uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
113e1c3962e268ffc12bfd1bd9ea84da1f135f36960Glenn Kasten                audio_format_t format=AUDIO_FORMAT_PCM_16_BIT,
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                int bufferCount=DEFAULT_AUDIOSINK_BUFFERCOUNT,
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                AudioCallback cb = NULL,
1161948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent                void *cookie = NULL,
117ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald                audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
118faeb0f291330134dc4468359a36e099aae508449Ronghua Wu                const audio_offload_info_t *offloadInfo = NULL,
119179652ee2a508361df1aa18e99000373886f0816Andy Hung                bool doNotReconnect = false,
120179652ee2a508361df1aa18e99000373886f0816Andy Hung                uint32_t suggestedFrameCount = 0) = 0;
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
122d89532e133b881c7e0dac089333ad7642fc510f1Richard Fitzgerald        virtual status_t    start() = 0;
1237d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia
1247d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia        /* Input parameter |size| is in byte units stored in |buffer|.
1257d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * Data is copied over and actual number of bytes written (>= 0)
1267d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * is returned, or no data is copied and a negative status code
1277d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * is returned (even when |blocking| is true).
1287d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * When |blocking| is false, AudioSink will immediately return after
1297d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * part of or full |buffer| is copied over.
1307d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * When |blocking| is true, AudioSink will wait to copy the entire
1317d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * buffer, unless an error occurs or the copy operation is
1327d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         * prematurely stopped.
1337d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia         */
1347d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia        virtual ssize_t     write(const void* buffer, size_t size, bool blocking = true) = 0;
1357d3f4df0a77e052a7d37de9268aff8c2ed0909ccWei Jia
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        stop() = 0;
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        flush() = 0;
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        pause() = 0;
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        virtual void        close() = 0;
1407a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi
1413a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        virtual status_t    setPlaybackRate(const AudioPlaybackRate& rate) = 0;
1423a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        virtual status_t    getPlaybackRate(AudioPlaybackRate* rate /* nonnull */) = 0;
1436b74d671a1321a6ecc4a40b6c87beedfecc1ec44Marco Nelissen        virtual bool        needsTrailingPadding() { return true; }
144ad3af3305f024bcbbd55c894a4995e449498e1baRichard Fitzgerald
145ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar        virtual status_t    setParameters(const String8& /* keyValuePairs */) { return NO_ERROR; }
146ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar        virtual String8     getParameters(const String8& /* keys */) { return String8::empty(); }
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    };
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        MediaPlayerBase() : mCookie(0), mNotify(0) {}
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual             ~MediaPlayerBase() {}
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    initCheck() = 0;
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        hardwareOutput() = 0;
1532db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
154ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t    setUID(uid_t /* uid */) {
1559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        return INVALID_OPERATION;
1569b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    }
1579b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
1582db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    virtual status_t    setDataSource(
1591b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            const sp<IMediaHTTPService> &httpService,
1602db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            const char *url,
1612db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber            const KeyedVector<String8, String8> *headers = NULL) = 0;
1622db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    setDataSource(int fd, int64_t offset, int64_t length) = 0;
164e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
165ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t    setDataSource(const sp<IStreamSource>& /* source */) {
166e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        return INVALID_OPERATION;
16799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
16899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
169ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t    setDataSource(const sp<DataSource>& /* source */) {
17099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return INVALID_OPERATION;
171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
172e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
173484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden    // pass the buffered IGraphicBufferProducer to the media player service
1741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    virtual status_t    setVideoSurfaceTexture(
175484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden                                const sp<IGraphicBufferProducer>& bufferProducer) = 0;
1761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    prepare() = 0;
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    prepareAsync() = 0;
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    start() = 0;
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    stop() = 0;
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    pause() = 0;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        isPlaying() = 0;
1833a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    virtual status_t    setPlaybackSettings(const AudioPlaybackRate& rate) {
1843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        // by default, players only support setting rate to the default
1853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (!isAudioPlaybackRateEqual(rate, AUDIO_PLAYBACK_RATE_DEFAULT)) {
1863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return BAD_VALUE;
1873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
1883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return OK;
1893a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
1903a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    virtual status_t    getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) {
1913a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        *rate = AUDIO_PLAYBACK_RATE_DEFAULT;
1923a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return OK;
1933a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
1943a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    virtual status_t    setSyncSettings(const AVSyncSettings& sync, float /* videoFps */) {
1953a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        // By default, players only support setting sync source to default; all other sync
1963a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        // settings are ignored. There is no requirement for getters to return set values.
1973a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        if (sync.mSource != AVSYNC_SOURCE_DEFAULT) {
1983a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar            return BAD_VALUE;
1993a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        }
2003a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return OK;
2013a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
2023a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    virtual status_t    getSyncSettings(
2033a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar                                AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */) {
2043a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        *sync = AVSyncSettings();
2053a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        *videoFps = -1.f;
2063a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar        return OK;
2073a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar    }
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    seekTo(int msec) = 0;
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    getCurrentPosition(int *msec) = 0;
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    getDuration(int *msec) = 0;
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    reset() = 0;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    setLooping(int loop) = 0;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual player_type playerType() = 0;
2144f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    virtual status_t    setParameter(int key, const Parcel &request) = 0;
2154f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    virtual status_t    getParameter(int key, Parcel *reply) = 0;
2164e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
2175f7e55ea443c80ef8b6173efd1c2551e07309b0aJohn Grossman    // default no-op implementation of optional extensions
218ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t setRetransmitEndpoint(const struct sockaddr_in* /* endpoint */) {
219c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman        return INVALID_OPERATION;
220c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman    }
221ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t getRetransmitEndpoint(struct sockaddr_in* /* endpoint */) {
22244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return INVALID_OPERATION;
22344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
224ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t setNextPlayer(const sp<MediaPlayerBase>& /* next */) {
2255f7e55ea443c80ef8b6173efd1c2551e07309b0aJohn Grossman        return OK;
2265f7e55ea443c80ef8b6173efd1c2551e07309b0aJohn Grossman    }
227c795b64060c3af9d7961fc1371e4ccfa8ee3e450John Grossman
2281d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // Invoke a generic method on the player by using opaque parcels
2291d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // for the request and reply.
230d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    //
2311d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // @param request Parcel that is positioned at the start of the
2321d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    //                data sent by the java layer.
2331d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    // @param[out] reply Parcel to hold the reply data. Cannot be null.
234d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @return OK if the call was successful.
2351d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania    virtual status_t    invoke(const Parcel& request, Parcel *reply) = 0;
236d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko
237d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // The Client in the MetadataPlayerService calls this method on
238d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // the native player to retrieve all or a subset of metadata.
239d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    //
240d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @param ids SortedList of metadata ID to be fetch. If empty, all
241d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    //            the known metadata should be returned.
242d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @param[inout] records Parcel where the player appends its metadata.
243d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko    // @return OK if the call was successful.
244ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t    getMetadata(const media::Metadata::Filter& /* ids */,
245ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar                                    Parcel* /* records */) {
246a64c8c79af1a15911c55306d83a797fa50969f77niko        return INVALID_OPERATION;
247a64c8c79af1a15911c55306d83a797fa50969f77niko    };
248d608a813a9d2cbc6e2a5ea81d78d4a9044090c4cniko
24901f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    void        setNotifyCallback(
25001f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber            void* cookie, notify_callback_f notifyFunc) {
25101f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber        Mutex::Autolock autoLock(mNotifyLock);
25201f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber        mCookie = cookie; mNotify = notifyFunc;
25301f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    }
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
255b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang    void        sendEvent(int msg, int ext1=0, int ext2=0,
256b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang                          const Parcel *obj=NULL) {
257df2592beab557663a471da2ac33ca463f7eee722Chong Zhang        notify_callback_f notifyCB;
258df2592beab557663a471da2ac33ca463f7eee722Chong Zhang        void* cookie;
259df2592beab557663a471da2ac33ca463f7eee722Chong Zhang        {
260df2592beab557663a471da2ac33ca463f7eee722Chong Zhang            Mutex::Autolock autoLock(mNotifyLock);
261df2592beab557663a471da2ac33ca463f7eee722Chong Zhang            notifyCB = mNotify;
262df2592beab557663a471da2ac33ca463f7eee722Chong Zhang            cookie = mCookie;
263df2592beab557663a471da2ac33ca463f7eee722Chong Zhang        }
264df2592beab557663a471da2ac33ca463f7eee722Chong Zhang
265df2592beab557663a471da2ac33ca463f7eee722Chong Zhang        if (notifyCB) notifyCB(cookie, msg, ext1, ext2, obj);
26601f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    }
26701f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber
268ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const {
269a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        return INVALID_OPERATION;
270a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
271a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
27201f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huberprivate:
27301f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    friend class MediaPlayerService;
27401f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber
27501f394247f3d5851f5bb12c2786b5fee265b6357Andreas Huber    Mutex               mNotifyLock;
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void*               mCookie;
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    notify_callback_f   mNotify;
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Implement this class for media players that use the AudioFlinger software mixer
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaPlayerInterface : public MediaPlayerBase
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual             ~MediaPlayerInterface() { }
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        hardwareOutput() { return false; }
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void        setAudioSink(const sp<AudioSink>& audioSink) { mAudioSink = audioSink; }
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprotected:
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<AudioSink>       mAudioSink;
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2911173118eace0e9e347cb007f0da817cee87579edGlenn Kasten// Implement this class for media players that output audio directly to hardware
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaPlayerHWInterface : public MediaPlayerBase
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual             ~MediaPlayerHWInterface() {}
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual bool        hardwareOutput() { return true; }
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual status_t    setVolume(float leftVolume, float rightVolume) = 0;
298fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    virtual status_t    setAudioStreamType(audio_stream_type_t streamType) = 0;
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // __cplusplus
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_MEDIAPLAYERINTERFACE_H
307