diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/media/AudioRecord.h | 17 | ||||
-rw-r--r-- | include/media/AudioSystem.h | 2 | ||||
-rw-r--r-- | include/media/AudioTrack.h | 45 | ||||
-rw-r--r-- | include/media/EffectApi.h | 22 | ||||
-rw-r--r-- | include/media/EffectFactoryApi.h | 12 | ||||
-rw-r--r-- | include/media/IAudioFlinger.h | 27 | ||||
-rw-r--r-- | include/media/IAudioTrack.h | 5 | ||||
-rw-r--r-- | include/private/media/AudioEffectShared.h | 51 | ||||
-rw-r--r-- | include/private/media/AudioTrackShared.h | 3 |
9 files changed, 162 insertions, 22 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index 92bc126..d956882 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -142,7 +142,8 @@ public: uint32_t flags = 0, callback_t cbf = 0, void* user = 0, - int notificationFrames = 0); + int notificationFrames = 0, + int sessionId = 0); /* Terminates the AudioRecord and unregisters it from AudioFlinger. @@ -168,7 +169,8 @@ public: callback_t cbf = 0, void* user = 0, int notificationFrames = 0, - bool threadCanCallJava = false); + bool threadCanCallJava = false, + int sessionId = 0); /* Result of constructing the AudioRecord. This must be checked @@ -270,6 +272,16 @@ public: */ audio_io_handle_t getInput(); + /* returns the audio session ID associated to this AudioRecord. + * + * Parameters: + * none. + * + * Returned value: + * AudioRecord session ID. + */ + int getSessionId(); + /* obtains a buffer of "frameCount" frames. The buffer must be * filled entirely. If the track is stopped, obtainBuffer() returns * STOPPED instead of NO_ERROR as long as there are buffers availlable, @@ -356,6 +368,7 @@ private: uint32_t mFlags; uint32_t mChannels; audio_io_handle_t mInput; + int mSessionId; }; }; // namespace android diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 9caef8f..f21e83d 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -230,6 +230,8 @@ public: static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream = DEFAULT); static unsigned int getInputFramesLost(audio_io_handle_t ioHandle); + + static int newAudioSessionId(); // // AudioPolicyService interface // diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index cc4ab74..c46df1e 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -138,7 +138,8 @@ public: uint32_t flags = 0, callback_t cbf = 0, void* user = 0, - int notificationFrames = 0); + int notificationFrames = 0, + int sessionId = 0); /* Creates an audio track and registers it with AudioFlinger. With this constructor, * The PCM data to be rendered by AudioTrack is passed in a shared memory buffer @@ -157,7 +158,8 @@ public: uint32_t flags = 0, callback_t cbf = 0, void* user = 0, - int notificationFrames = 0); + int notificationFrames = 0, + int sessionId = 0); /* Terminates the AudioTrack and unregisters it from AudioFlinger. * Also destroys all resources assotiated with the AudioTrack. @@ -182,7 +184,8 @@ public: void* user = 0, int notificationFrames = 0, const sp<IMemory>& sharedBuffer = 0, - bool threadCanCallJava = false); + bool threadCanCallJava = false, + int sessionId = 0); /* Result of constructing the AudioTrack. This must be checked @@ -239,10 +242,17 @@ public: /* set volume for this track, mostly used for games' sound effects + * left and right volumes. Levels must be <= 1.0. */ - void setVolume(float left, float right); + status_t setVolume(float left, float right); void getVolume(float* left, float* right); + /* set the send level for this track. An auxiliary effect should be attached + * to the track with attachEffect(). Level must be <= 1.0. + */ + status_t setSendLevel(float level); + void getSendLevel(float* level); + /* set sample rate for this track, mostly used for games' sound effects */ status_t setSampleRate(int sampleRate); @@ -340,6 +350,31 @@ public: */ audio_io_handle_t getOutput(); + /* returns the unique ID associated to this track. + * + * Parameters: + * none. + * + * Returned value: + * AudioTrack ID. + */ + int getSessionId(); + + + /* Attach track auxiliary output to specified effect. Used effectId = 0 + * to detach track from effect. + * + * Parameters: + * + * effectId: effectId obtained from AudioEffect::id(). + * + * Returned status (from utils/Errors.h) can be: + * - NO_ERROR: successful operation + * - INVALID_OPERATION: the effect is not an auxiliary effect. + * - BAD_VALUE: The specified effect ID is invalid + */ + status_t attachAuxEffect(int effectId); + /* obtains a buffer of "frameCount" frames. The buffer must be * filled entirely. If the track is stopped, obtainBuffer() returns * STOPPED instead of NO_ERROR as long as there are buffers availlable, @@ -406,6 +441,7 @@ private: sp<AudioTrackThread> mAudioTrackThread; float mVolume[2]; + float mSendLevel; uint32_t mFrameCount; audio_track_cblk_t* mCblk; @@ -431,6 +467,7 @@ private: uint32_t mNewPosition; uint32_t mUpdatePeriod; uint32_t mFlags; + int mSessionId; }; diff --git a/include/media/EffectApi.h b/include/media/EffectApi.h index a1bc3b8..97874f7 100644 --- a/include/media/EffectApi.h +++ b/include/media/EffectApi.h @@ -114,7 +114,8 @@ typedef struct effect_descriptor_s { // +---------------------------+-----------+----------------------------------- // | Volume management | 5..6 | 0 none // | | | 1 implements volume control -// | | | 2..3 reserved +// | | | 2 requires volume indication +// | | | 3 reserved // +---------------------------+-----------+----------------------------------- // | Device management | 7..8 | 0 none // | | | 1 requires device updates @@ -154,6 +155,7 @@ typedef struct effect_descriptor_s { // volume control #define EFFECT_FLAG_VOLUME_MASK 0x00000060 #define EFFECT_FLAG_VOLUME_CTRL 0x00000020 +#define EFFECT_FLAG_VOLUME_IND 0x00000040 #define EFFECT_FLAG_VOLUME_NONE 0x00000000 // device control @@ -296,10 +298,12 @@ struct effect_interface_s { // | Set and get volume. Used by | EFFECT_CMD_SET_VOLUME | size: n * sizeof(uint32_t) | size: n * sizeof(uint32_t) // | audio framework to delegate | | data: volume for each channel | data: volume for each channel // | volume control to effect engine| | defined in effect_config_t in | defined in effect_config_t in -// | The engine must return the | | 8.24 fixed point format | 8.24 fixed point format -// | volume that should be applied | | | -// | before the effect is processed | | | -// | The overall volume (the volume | | | +// | If volume control flag is set | | 8.24 fixed point format | 8.24 fixed point format +// | in the effect descriptor, the | | | It is legal to receive a null +// | effect engine must return the | | | pointer as pReplyData in which +// | volume that should be applied | | | case the effect framework has +// | before the effect is processed | | | delegated volume control to +// | The overall volume (the volume | | | another effect. // | actually applied by the effect | | | // | multiplied by the returned | | | // | value) should match the | | | @@ -370,7 +374,7 @@ typedef struct buffer_provider_s { // structure that defines both input and output buffer configurations and is // passed by the EFFECT_CMD_CONFIGURE command. typedef struct buffer_config_s { - audio_buffer_t buffer; // buffer for use by process() function is not passed explicitly + audio_buffer_t buffer; // buffer for use by process() function if not passed explicitly uint32_t samplingRate; // sampling rate uint32_t channels; // channel mask (see audio_channels_e in AudioCommon.h) buffer_provider_t bufferProvider; // buffer provider @@ -457,7 +461,7 @@ typedef struct effect_param_s { // // Function: EffectQueryNumberEffects // -// Description: Returns the number of different effect exposed by the +// Description: Returns the number of different effects exposed by the // library. Each effect must have a unique effect uuid (see // effect_descriptor_t). This function together with EffectQueryNext() // is used to enumerate all effects present in the library. @@ -475,7 +479,7 @@ typedef struct effect_param_s { // *pNumEffects: updated with number of effects in library // //////////////////////////////////////////////////////////////////////////////// -typedef int32_t (*effect_QueryNumberEffects_t)(int32_t *pNumEffects); +typedef int32_t (*effect_QueryNumberEffects_t)(uint32_t *pNumEffects); //////////////////////////////////////////////////////////////////////////////// // @@ -521,7 +525,7 @@ typedef int32_t (*effect_QueryNextEffect_t)(effect_descriptor_t *pDescriptor); // returned value: 0 successful operation. // -ENODEV library failed to initialize // -EINVAL invalid pEffectUuid or pInterface -// -ENOENT No effect with this uuid found +// -ENOENT no effect with this uuid found // *pInterface: updated with the effect interface handle. // //////////////////////////////////////////////////////////////////////////////// diff --git a/include/media/EffectFactoryApi.h b/include/media/EffectFactoryApi.h index 8179c23..6cc9932 100644 --- a/include/media/EffectFactoryApi.h +++ b/include/media/EffectFactoryApi.h @@ -34,7 +34,7 @@ extern "C" { // // Function: EffectQueryNumberEffects // -// Description: Returns the number of different effect in all loaded libraries. +// Description: Returns the number of different effects in all loaded libraries. // Each effect must have a different effect uuid (see // effect_descriptor_t). This function together with EffectQueryNext() // is used to enumerate all effects present in all loaded libraries. @@ -52,7 +52,7 @@ extern "C" { // *pNumEffects: updated with number of effects in factory // //////////////////////////////////////////////////////////////////////////////// -int EffectQueryNumberEffects(int *pNumEffects); +int EffectQueryNumberEffects(uint32_t *pNumEffects); //////////////////////////////////////////////////////////////////////////////// // @@ -98,7 +98,7 @@ int EffectQueryNext(effect_descriptor_t *pDescriptor); // returned value: 0 successful operation. // -ENODEV factory failed to initialize // -EINVAL invalid pEffectUuid or pInterface -// -ENOENT No effect with this uuid found +// -ENOENT no effect with this uuid found // *pInterface: updated with the effect interface. // //////////////////////////////////////////////////////////////////////////////// @@ -140,7 +140,7 @@ int EffectRelease(effect_interface_t interface); // // Output: // returned value: 0 successful operation. -// -ENODEV Effect factory not initialized or +// -ENODEV effect factory not initialized or // library could not be loaded or // library does not implement required functions // -EINVAL invalid libPath string or handle @@ -159,7 +159,7 @@ int EffectLoadLibrary(const char *libPath, int *handle); // // Output: // returned value: 0 successful operation. -// -ENODEV Effect factory not initialized +// -ENODEV effect factory not initialized // -ENOENT invalid handle // //////////////////////////////////////////////////////////////////////////////// @@ -184,7 +184,7 @@ int EffectUnloadLibrary(int handle); // returned value: 0 successful operation. // -ENODEV factory failed to initialize // -EINVAL invalid pEffectUuid or pDescriptor -// -ENOENT No effect with this uuid found +// -ENOENT no effect with this uuid found // *pDescriptor: updated with the effect descriptor. // //////////////////////////////////////////////////////////////////////////////// diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h index c147632..ccfa530 100644 --- a/include/media/IAudioFlinger.h +++ b/include/media/IAudioFlinger.h @@ -27,6 +27,9 @@ #include <media/IAudioTrack.h> #include <media/IAudioRecord.h> #include <media/IAudioFlingerClient.h> +#include <media/EffectApi.h> +#include <media/IEffect.h> +#include <media/IEffectClient.h> #include <utils/String8.h> namespace android { @@ -51,6 +54,7 @@ public: uint32_t flags, const sp<IMemory>& sharedBuffer, int output, + int *sessionId, status_t *status) = 0; virtual sp<IAudioRecord> openRecord( @@ -61,6 +65,7 @@ public: int channelCount, int frameCount, uint32_t flags, + int *sessionId, status_t *status) = 0; /* query the audio hardware state. This state never changes, @@ -134,6 +139,28 @@ public: virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) = 0; virtual unsigned int getInputFramesLost(int ioHandle) = 0; + + virtual int newAudioSessionId() = 0; + + virtual status_t loadEffectLibrary(const char *libPath, int *handle) = 0; + + virtual status_t unloadEffectLibrary(int handle) = 0; + + virtual status_t queryNumberEffects(uint32_t *numEffects) = 0; + + virtual status_t queryNextEffect(effect_descriptor_t *pDescriptor) = 0; + + virtual status_t getEffectDescriptor(effect_uuid_t *pEffectUUID, effect_descriptor_t *pDescriptor) = 0; + + virtual sp<IEffect> createEffect(pid_t pid, + effect_descriptor_t *pDesc, + const sp<IEffectClient>& client, + int32_t priority, + int output, + int sessionId, + status_t *status, + int *id, + int *enabled) = 0; }; diff --git a/include/media/IAudioTrack.h b/include/media/IAudioTrack.h index de6426a..47d530b 100644 --- a/include/media/IAudioTrack.h +++ b/include/media/IAudioTrack.h @@ -62,6 +62,11 @@ public: */ virtual void pause() = 0; + /* Attach track auxiliary output to specified effect. Use effectId = 0 + * to detach track from effect. + */ + virtual status_t attachAuxEffect(int effectId) = 0; + /* get this tracks control block */ virtual sp<IMemory> getCblk() const = 0; }; diff --git a/include/private/media/AudioEffectShared.h b/include/private/media/AudioEffectShared.h new file mode 100644 index 0000000..a3a99a4 --- /dev/null +++ b/include/private/media/AudioEffectShared.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_EFFECTCBASESHARED_H +#define ANDROID_EFFECTCBASESHARED_H + +#include <stdint.h> +#include <sys/types.h> + +#include <utils/threads.h> + +namespace android { + +// ---------------------------------------------------------------------------- + +// Size of buffer used to exchange parameters between application and mediaserver processes. +#define EFFECT_PARAM_BUFFER_SIZE 1024 + + +// Shared memory area used to exchange parameters between application and mediaserver +// process. +struct effect_param_cblk_t +{ + Mutex lock; + volatile uint32_t clientIndex; // Current read/write index for application + volatile uint32_t serverIndex; // Current read/write index for mediaserver + uint8_t* buffer; // start of parameter buffer + + effect_param_cblk_t() + : lock(Mutex::SHARED), clientIndex(0), serverIndex(0) {} +}; + + +// ---------------------------------------------------------------------------- + +}; // namespace android + +#endif // ANDROID_EFFECTCBASESHARED_H diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h index cd47fdf..1510f87 100644 --- a/include/private/media/AudioTrackShared.h +++ b/include/private/media/AudioTrackShared.h @@ -78,7 +78,8 @@ struct audio_track_cblk_t uint16_t bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger uint16_t waitTimeMs; // Cumulated wait time - uint32_t reserved; + uint16_t sendLevel; + uint16_t reserved; // Cache line boundary (32 bytes) audio_track_cblk_t(); uint32_t stepUser(uint32_t frameCount); |