diff options
Diffstat (limited to 'media/libmedia/AudioTrack.cpp')
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 202 |
1 files changed, 25 insertions, 177 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 39e3c3d..569eb5c 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -28,6 +28,7 @@ #include <utils/Log.h> #include <private/media/AudioTrackShared.h> #include <media/IAudioFlinger.h> +#include <media/AudioPolicyHelper.h> #include <media/AudioResamplerPublic.h> #define WAIT_PERIOD_MS 10 @@ -278,30 +279,22 @@ status_t AudioTrack::set( } // handle default values first. - // TODO once AudioPolicyManager fully supports audio_attributes_t, - // remove stream "text-to-speech" redirect - if ((streamType == AUDIO_STREAM_DEFAULT) || (streamType == AUDIO_STREAM_TTS)) { + if (streamType == AUDIO_STREAM_DEFAULT) { streamType = AUDIO_STREAM_MUSIC; } - if (pAttributes == NULL) { if (uint32_t(streamType) >= AUDIO_STREAM_PUBLIC_CNT) { ALOGE("Invalid stream type %d", streamType); return BAD_VALUE; } - setAttributesFromStreamType(streamType); mStreamType = streamType; + } else { - if (!isValidAttributes(pAttributes)) { - ALOGE("Invalid attributes: usage=%d content=%d flags=0x%x tags=[%s]", - pAttributes->usage, pAttributes->content_type, pAttributes->flags, - pAttributes->tags); - } // stream type shouldn't be looked at, this track has audio attributes memcpy(&mAttributes, pAttributes, sizeof(audio_attributes_t)); - setStreamTypeFromAttributes(mAttributes); ALOGV("Building AudioTrack with attributes: usage=%d content=%d flags=0x%x tags=[%s]", mAttributes.usage, mAttributes.content_type, mAttributes.flags, mAttributes.tags); + mStreamType = AUDIO_STREAM_DEFAULT; } // these below should probably come from the audioFlinger too... @@ -341,10 +334,6 @@ status_t AudioTrack::set( // FIXME why can't we allow direct AND fast? ((flags | AUDIO_OUTPUT_FLAG_DIRECT) & ~AUDIO_OUTPUT_FLAG_FAST); } - // only allow deep buffering for music stream type - if (mStreamType != AUDIO_STREAM_MUSIC) { - flags = (audio_output_flags_t)(flags &~AUDIO_OUTPUT_FLAG_DEEP_BUFFER); - } if (flags & AUDIO_OUTPUT_FLAG_DIRECT) { if (audio_is_linear_pcm(format)) { @@ -914,24 +903,38 @@ status_t AudioTrack::attachAuxEffect(int effectId) return status; } +audio_stream_type_t AudioTrack::streamType() const +{ + if (mStreamType == AUDIO_STREAM_DEFAULT) { + return audio_attributes_to_stream_type(&mAttributes); + } + return mStreamType; +} + // ------------------------------------------------------------------------- // must be called with mLock held status_t AudioTrack::createTrack_l() { - status_t status; const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger(); if (audioFlinger == 0) { ALOGE("Could not get audioflinger"); return NO_INIT; } - audio_io_handle_t output = AudioSystem::getOutputForAttr(&mAttributes, mSampleRate, mFormat, - mChannelMask, mFlags, mOffloadInfo); - if (output == AUDIO_IO_HANDLE_NONE) { + audio_io_handle_t output; + audio_stream_type_t streamType = mStreamType; + audio_attributes_t *attr = (mStreamType == AUDIO_STREAM_DEFAULT) ? &mAttributes : NULL; + status_t status = AudioSystem::getOutputForAttr(attr, &output, + (audio_session_t)mSessionId, &streamType, + mSampleRate, mFormat, mChannelMask, + mFlags, mOffloadInfo); + + + if (status != NO_ERROR || output == AUDIO_IO_HANDLE_NONE) { ALOGE("Could not get audio output for stream type %d, usage %d, sample rate %u, format %#x," " channel mask %#x, flags %#x", - mStreamType, mAttributes.usage, mSampleRate, mFormat, mChannelMask, mFlags); + streamType, mAttributes.usage, mSampleRate, mFormat, mChannelMask, mFlags); return BAD_VALUE; } { @@ -1085,7 +1088,7 @@ status_t AudioTrack::createTrack_l() size_t temp = frameCount; // temp may be replaced by a revised value of frameCount, // but we will still need the original value also - sp<IAudioTrack> track = audioFlinger->createTrack(mStreamType, + sp<IAudioTrack> track = audioFlinger->createTrack(streamType, mSampleRate, // AudioFlinger only sees 16-bit PCM mFormat == AUDIO_FORMAT_PCM_8_BIT && @@ -1231,7 +1234,7 @@ status_t AudioTrack::createTrack_l() } release: - AudioSystem::releaseOutput(output); + AudioSystem::releaseOutput(output, streamType, (audio_session_t)mSessionId); if (status == NO_ERROR) { status = NO_INIT; } @@ -2065,161 +2068,6 @@ uint32_t AudioTrack::getUnderrunFrames() const return mProxy->getUnderrunFrames(); } -void AudioTrack::setAttributesFromStreamType(audio_stream_type_t streamType) { - mAttributes.flags = 0x0; - - switch(streamType) { - case AUDIO_STREAM_DEFAULT: - case AUDIO_STREAM_MUSIC: - mAttributes.content_type = AUDIO_CONTENT_TYPE_MUSIC; - mAttributes.usage = AUDIO_USAGE_MEDIA; - break; - case AUDIO_STREAM_VOICE_CALL: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SPEECH; - mAttributes.usage = AUDIO_USAGE_VOICE_COMMUNICATION; - break; - case AUDIO_STREAM_ENFORCED_AUDIBLE: - mAttributes.flags |= AUDIO_FLAG_AUDIBILITY_ENFORCED; - // intended fall through, attributes in common with STREAM_SYSTEM - case AUDIO_STREAM_SYSTEM: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SONIFICATION; - mAttributes.usage = AUDIO_USAGE_ASSISTANCE_SONIFICATION; - break; - case AUDIO_STREAM_RING: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SONIFICATION; - mAttributes.usage = AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE; - break; - case AUDIO_STREAM_ALARM: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SONIFICATION; - mAttributes.usage = AUDIO_USAGE_ALARM; - break; - case AUDIO_STREAM_NOTIFICATION: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SONIFICATION; - mAttributes.usage = AUDIO_USAGE_NOTIFICATION; - break; - case AUDIO_STREAM_BLUETOOTH_SCO: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SPEECH; - mAttributes.usage = AUDIO_USAGE_VOICE_COMMUNICATION; - mAttributes.flags |= AUDIO_FLAG_SCO; - break; - case AUDIO_STREAM_DTMF: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SONIFICATION; - mAttributes.usage = AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING; - break; - case AUDIO_STREAM_TTS: - mAttributes.content_type = AUDIO_CONTENT_TYPE_SPEECH; - mAttributes.usage = AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY; - break; - default: - ALOGE("invalid stream type %d when converting to attributes", streamType); - } -} - -void AudioTrack::setStreamTypeFromAttributes(audio_attributes_t& aa) { - // flags to stream type mapping - if ((aa.flags & AUDIO_FLAG_AUDIBILITY_ENFORCED) == AUDIO_FLAG_AUDIBILITY_ENFORCED) { - mStreamType = AUDIO_STREAM_ENFORCED_AUDIBLE; - return; - } - if ((aa.flags & AUDIO_FLAG_SCO) == AUDIO_FLAG_SCO) { - mStreamType = AUDIO_STREAM_BLUETOOTH_SCO; - return; - } - // TODO once AudioPolicyManager fully supports audio_attributes_t, - // remove stream remap, the flag will be enough - if ((aa.flags & AUDIO_FLAG_BEACON) == AUDIO_FLAG_BEACON) { - mStreamType = AUDIO_STREAM_TTS; - return; - } - - // usage to stream type mapping - switch (aa.usage) { - case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY: { - // TODO once AudioPolicyManager fully supports audio_attributes_t, - // remove stream change based on stream activity - bool active; - status_t status = AudioSystem::isStreamActive(AUDIO_STREAM_RING, &active, 0); - if (status == NO_ERROR && active == true) { - mStreamType = AUDIO_STREAM_RING; - break; - } - status = AudioSystem::isStreamActive(AUDIO_STREAM_ALARM, &active, 0); - if (status == NO_ERROR && active == true) { - mStreamType = AUDIO_STREAM_ALARM; - break; - } - audio_mode_t phoneState = AudioSystem::getPhoneState(); - if (phoneState == AUDIO_MODE_IN_CALL || phoneState == AUDIO_MODE_IN_COMMUNICATION) { - mStreamType = AUDIO_STREAM_VOICE_CALL; - break; - } - } /// FALL THROUGH - case AUDIO_USAGE_MEDIA: - case AUDIO_USAGE_GAME: - case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: - mStreamType = AUDIO_STREAM_MUSIC; - return; - case AUDIO_USAGE_ASSISTANCE_SONIFICATION: - mStreamType = AUDIO_STREAM_SYSTEM; - return; - case AUDIO_USAGE_VOICE_COMMUNICATION: - mStreamType = AUDIO_STREAM_VOICE_CALL; - return; - - case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING: - mStreamType = AUDIO_STREAM_DTMF; - return; - - case AUDIO_USAGE_ALARM: - mStreamType = AUDIO_STREAM_ALARM; - return; - case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE: - mStreamType = AUDIO_STREAM_RING; - return; - - case AUDIO_USAGE_NOTIFICATION: - case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST: - case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT: - case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED: - case AUDIO_USAGE_NOTIFICATION_EVENT: - mStreamType = AUDIO_STREAM_NOTIFICATION; - return; - - case AUDIO_USAGE_UNKNOWN: - default: - mStreamType = AUDIO_STREAM_MUSIC; - } -} - -bool AudioTrack::isValidAttributes(const audio_attributes_t *paa) { - // has flags that map to a strategy? - if ((paa->flags & (AUDIO_FLAG_AUDIBILITY_ENFORCED | AUDIO_FLAG_SCO | AUDIO_FLAG_BEACON)) != 0) { - return true; - } - - // has known usage? - switch (paa->usage) { - case AUDIO_USAGE_UNKNOWN: - case AUDIO_USAGE_MEDIA: - case AUDIO_USAGE_VOICE_COMMUNICATION: - case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING: - case AUDIO_USAGE_ALARM: - case AUDIO_USAGE_NOTIFICATION: - case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE: - case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST: - case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT: - case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED: - case AUDIO_USAGE_NOTIFICATION_EVENT: - case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY: - case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: - case AUDIO_USAGE_ASSISTANCE_SONIFICATION: - case AUDIO_USAGE_GAME: - break; - default: - return false; - } - return true; -} // ========================================================================= void AudioTrack::DeathNotifier::binderDied(const wp<IBinder>& who __unused) |