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