diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2011-05-24 15:53:33 -0700 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2011-06-01 10:55:29 -0700 |
commit | 5439223b5633679edcc255651e7062046004d75d (patch) | |
tree | 683090bec6f1a9a0fe95609fe5becf54aa3b1f8a /services/audioflinger/AudioMixer.cpp | |
parent | 3a4b8bb6756120cfdef2faa7c1966963ef011faf (diff) | |
download | frameworks_base-5439223b5633679edcc255651e7062046004d75d.zip frameworks_base-5439223b5633679edcc255651e7062046004d75d.tar.gz frameworks_base-5439223b5633679edcc255651e7062046004d75d.tar.bz2 |
Use channel mask instead of channel count for track creation
Record and playback objects (resp AudioRecord and AudioTrack)
are created using a channel mask, but this information is lost
in the mixer because only the channel count is known to
AudioFlinger. A channel count can always be derived from a
channel mask.
The change consists in:
- disambiguiting variable names for channel masks and counts
- passing the mask information from the client to AudioFlinger
and the mixer.
- when using the DIRECT ouput, only verifying the format of
the track is compatible with the output's for PCM.
Change-Id: I50d87bfb7d7afcabdf5f12d4ab75ef3a54132c0e
Diffstat (limited to 'services/audioflinger/AudioMixer.cpp')
-rw-r--r-- | services/audioflinger/AudioMixer.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 50dcda7..6e9319d 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -26,6 +26,10 @@ #include <utils/Errors.h> #include <utils/Log.h> +#include <cutils/bitops.h> + +#include <system/audio.h> + #include "AudioMixer.h" namespace android { @@ -61,6 +65,7 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) t->channelCount = 2; t->enabled = 0; t->format = 16; + t->channelMask = AUDIO_CHANNEL_OUT_STEREO; t->buffer.raw = 0; t->bufferProvider = 0; t->hook = 0; @@ -180,13 +185,18 @@ status_t AudioMixer::setParameter(int target, int name, void *value) switch (target) { case TRACK: - if (name == CHANNEL_COUNT) { - if ((uint32_t(valueInt) <= MAX_NUM_CHANNELS) && (valueInt)) { - if (mState.tracks[ mActiveTrack ].channelCount != valueInt) { - mState.tracks[ mActiveTrack ].channelCount = valueInt; - LOGV("setParameter(TRACK, CHANNEL_COUNT, %d)", valueInt); + if (name == CHANNEL_MASK) { + uint32_t mask = (uint32_t)value; + if (mState.tracks[ mActiveTrack ].channelMask != mask) { + uint8_t channelCount = popcount(mask); + if ((channelCount <= MAX_NUM_CHANNELS) && (channelCount)) { + mState.tracks[ mActiveTrack ].channelMask = mask; + mState.tracks[ mActiveTrack ].channelCount = channelCount; + LOGV("setParameter(TRACK, CHANNEL_MASK, %x)", mask); invalidateState(1<<mActiveTrack); + return NO_ERROR; } + } else { return NO_ERROR; } } |