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