summaryrefslogtreecommitdiffstats
path: root/media/libmedia/AudioTrack.cpp
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2015-11-04 13:56:04 -0800
committerSteve Kondik <steve@cyngn.com>2015-11-04 13:56:04 -0800
commit6bc1c721cab472b5e270b61c8f106d8f17fcecdc (patch)
tree3784861eb415ccd67ed1935c04180f44398e668d /media/libmedia/AudioTrack.cpp
parentf032c781e72f10bad56cc625152e6dffc87dd0a7 (diff)
parentce9e446bd8c72972af86917563225e618b49d451 (diff)
downloadframeworks_av-6bc1c721cab472b5e270b61c8f106d8f17fcecdc.zip
frameworks_av-6bc1c721cab472b5e270b61c8f106d8f17fcecdc.tar.gz
frameworks_av-6bc1c721cab472b5e270b61c8f106d8f17fcecdc.tar.bz2
Merge branch 'LA.BF64.1.2.2_rb4.6' of git://codeaurora.org/platform/frameworks/av into cm-13.0
Change-Id: Iec8118b9a24fafe47e4006fca8a8e993bacb5ba8
Diffstat (limited to 'media/libmedia/AudioTrack.cpp')
-rw-r--r--media/libmedia/AudioTrack.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 4a4df54..5af70d3 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -31,6 +31,7 @@
#include <media/AudioPolicyHelper.h>
#include <media/AudioResamplerPublic.h>
#include "media/AVMediaExtensions.h"
+#include <cutils/properties.h>
#define WAIT_PERIOD_MS 10
#define WAIT_STREAM_END_TIMEOUT_SEC 120
@@ -168,7 +169,8 @@ AudioTrack::AudioTrack()
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
mPreviousSchedulingGroup(SP_DEFAULT),
mPausedPosition(0),
- mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE)
+ mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
+ mPlaybackRateSet(false)
{
mAttributes.content_type = AUDIO_CONTENT_TYPE_UNKNOWN;
mAttributes.usage = AUDIO_USAGE_UNKNOWN;
@@ -198,7 +200,8 @@ AudioTrack::AudioTrack(
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
mPreviousSchedulingGroup(SP_DEFAULT),
mPausedPosition(0),
- mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE)
+ mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
+ mPlaybackRateSet(false)
{
mStatus = set(streamType, sampleRate, format, channelMask,
frameCount, flags, cbf, user, notificationFrames,
@@ -228,7 +231,8 @@ AudioTrack::AudioTrack(
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
mPreviousSchedulingGroup(SP_DEFAULT),
mPausedPosition(0),
- mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE)
+ mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
+ mPlaybackRateSet(false)
{
mStatus = set(streamType, sampleRate, format, channelMask,
0 /*frameCount*/, flags, cbf, user, notificationFrames,
@@ -844,6 +848,15 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
//set effective rates
mProxy->setPlaybackRate(playbackRateTemp);
mProxy->setSampleRate(effectiveRate); // FIXME: not quite "atomic" with setPlaybackRate
+
+ // fallback out of Direct PCM if setPlaybackRate is called on PCM track
+ if (property_get_bool("audio.offload.track.enable", false) &&
+ (mFormat == AUDIO_FORMAT_PCM_16_BIT) && (mOffloadInfo == NULL) &&
+ (mFlags == AUDIO_OUTPUT_FLAG_NONE)) {
+ mPlaybackRateSet = true;
+ android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
+ }
+
return NO_ERROR;
}
@@ -1135,11 +1148,16 @@ status_t AudioTrack::createTrack_l()
audio_stream_type_t streamType = mStreamType;
audio_attributes_t *attr = (mStreamType == AUDIO_STREAM_DEFAULT) ? &mAttributes : NULL;
- status_t status;
- status = AudioSystem::getOutputForAttr(attr, &output,
+ audio_offload_info_t tOffloadInfo = AUDIO_INFO_INITIALIZER;
+ if (mPlaybackRateSet == true && mOffloadInfo == NULL && mFormat == AUDIO_FORMAT_PCM_16_BIT) {
+ mOffloadInfo = &tOffloadInfo;
+ }
+ status_t status = AudioSystem::getOutputForAttr(attr, &output,
(audio_session_t)mSessionId, &streamType, mClientUid,
mSampleRate, mFormat, mChannelMask,
mFlags, mSelectedDeviceId, mOffloadInfo);
+ //reset offload info if forced
+ mOffloadInfo = (mOffloadInfo == &tOffloadInfo) ? NULL : mOffloadInfo;
if (status != NO_ERROR || output == AUDIO_IO_HANDLE_NONE) {
ALOGE("Could not get audio output for session %d, stream type %d, usage %d, sample rate %u, format %#x,"
@@ -2318,7 +2336,7 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
} else {
// Update the mapping between local consumed (mPosition) and server consumed (mServer)
- if (AVMediaUtils::get()->AudioTrackGetTimestamp(this, timestamp) == NO_ERROR) {
+ if (AVMediaUtils::get()->AudioTrackGetTimestamp(this, &timestamp) == NO_ERROR) {
return NO_ERROR;
}