@ -17,12 +17,12 @@
# define LOG_TAG "AudioPolicyIntefaceImpl"
//#define LOG_NDEBUG 0
# include <utils/Log.h>
# include <media/MediaAnalyticsItem.h>
# include "AudioPolicyService.h"
# include <mediautils/ServiceUtilities.h>
# include "TypeConverter.h"
# include <media/AudioPolicyHelper.h>
# include <media/MediaAnalyticsItem.h>
# include <mediautils/ServiceUtilities.h>
# include <utils/Log.h>
namespace android {
@ -208,93 +208,128 @@ status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
config ,
& flags , selectedDeviceId , portId ) ;
}
if ( result = = NO_ERROR ) {
sp < AudioPlaybackClient > client =
new AudioPlaybackClient ( * attr , * output , uid , pid , session , * selectedDeviceId , * stream ) ;
mAudioPlaybackClients . add ( * portId , client ) ;
}
return result ;
}
status_t AudioPolicyService : : startOutput ( audio_io_handle_t output ,
audio_stream_type_t stream ,
audio_session_t session )
status_t AudioPolicyService : : startOutput ( audio_port_handle_t portId )
{
if ( uint32_t ( stream ) > = AUDIO_STREAM_CNT ) {
return BAD_VALUE ;
}
if ( mAudioPolicyManager = = NULL ) {
return NO_INIT ;
}
ALOGV ( " startOutput() " ) ;
sp < AudioPlaybackClient > client ;
sp < AudioPolicyEffects > audioPolicyEffects ;
{
Mutex : : Autolock _l ( mLock ) ;
const ssize_t index = mAudioPlaybackClients . indexOfKey ( portId ) ;
if ( index < 0 ) {
ALOGE ( " %s AudioTrack client not found for portId %d " , __FUNCTION__ , portId ) ;
return INVALID_OPERATION ;
}
client = mAudioPlaybackClients . valueAt ( index ) ;
audioPolicyEffects = mAudioPolicyEffects ;
}
if ( audioPolicyEffects ! = 0 ) {
// create audio processors according to stream
status_t status = audioPolicyEffects - > addOutputSessionEffects ( output , stream , session ) ;
status_t status = audioPolicyEffects - > addOutputSessionEffects (
client - > io , client - > stream , client - > session ) ;
if ( status ! = NO_ERROR & & status ! = ALREADY_EXISTS ) {
ALOGW ( " Failed to add effects on session %d " , session) ;
ALOGW ( " Failed to add effects on session %d " , client- > session) ;
}
}
Mutex : : Autolock _l ( mLock ) ;
AutoCallerClear acc ;
return mAudioPolicyManager - > startOutput ( output , stream , session ) ;
status_t status = mAudioPolicyManager - > startOutput (
client - > io , client - > stream , client - > session ) ;
if ( status = = NO_ERROR ) {
client - > active = true ;
}
return status ;
}
status_t AudioPolicyService : : stopOutput ( audio_io_handle_t output ,
audio_stream_type_t stream ,
audio_session_t session )
status_t AudioPolicyService : : stopOutput ( audio_port_handle_t portId )
{
if ( uint32_t ( stream ) > = AUDIO_STREAM_CNT ) {
return BAD_VALUE ;
{
Mutex : : Autolock _l ( mLock ) ;
const ssize_t index = mAudioPlaybackClients . indexOfKey ( portId ) ;
if ( index < 0 ) {
ALOGE ( " %s AudioTrack client not found for portId %d " , __FUNCTION__ , portId ) ;
return INVALID_OPERATION ;
}
}
if ( mAudioPolicyManager = = NULL ) {
return NO_INIT ;
}
ALOGV ( " stopOutput() " ) ;
mOutputCommandThread - > stopOutputCommand ( output , stream , session ) ;
mOutputCommandThread - > stopOutputCommand ( portId ) ;
return NO_ERROR ;
}
status_t AudioPolicyService : : doStopOutput ( audio_io_handle_t output ,
audio_stream_type_t stream ,
audio_session_t session )
status_t AudioPolicyService : : doStopOutput ( audio_port_handle_t portId )
{
ALOGV ( " doStopOutput from tid %d " , gettid ( ) ) ;
ALOGV ( " doStopOutput " ) ;
sp < AudioPlaybackClient > client ;
sp < AudioPolicyEffects > audioPolicyEffects ;
{
Mutex : : Autolock _l ( mLock ) ;
const ssize_t index = mAudioPlaybackClients . indexOfKey ( portId ) ;
if ( index < 0 ) {
ALOGE ( " %s AudioTrack client not found for portId %d " , __FUNCTION__ , portId ) ;
return INVALID_OPERATION ;
}
client = mAudioPlaybackClients . valueAt ( index ) ;
audioPolicyEffects = mAudioPolicyEffects ;
}
if ( audioPolicyEffects ! = 0 ) {
// release audio processors from the stream
status_t status = audioPolicyEffects - > releaseOutputSessionEffects ( output , stream , session ) ;
status_t status = audioPolicyEffects - > releaseOutputSessionEffects (
client - > io , client - > stream , client - > session ) ;
if ( status ! = NO_ERROR & & status ! = ALREADY_EXISTS ) {
ALOGW ( " Failed to release effects on session %d " , session ) ;
ALOGW ( " Failed to release effects on session %d " , client- > session) ;
}
}
Mutex : : Autolock _l ( mLock ) ;
AutoCallerClear acc ;
return mAudioPolicyManager - > stopOutput ( output , stream , session ) ;
status_t status = mAudioPolicyManager - > stopOutput (
client - > io , client - > stream , client - > session ) ;
if ( status = = NO_ERROR ) {
client - > active = false ;
}
return status ;
}
void AudioPolicyService : : releaseOutput ( audio_io_handle_t output ,
audio_stream_type_t stream ,
audio_session_t session )
void AudioPolicyService : : releaseOutput ( audio_port_handle_t portId )
{
if ( mAudioPolicyManager = = NULL ) {
return ;
}
ALOGV ( " releaseOutput() " ) ;
mOutputCommandThread - > releaseOutputCommand ( output, stream , session ) ;
mOutputCommandThread - > releaseOutputCommand ( portId ) ;
}
void AudioPolicyService : : doReleaseOutput ( audio_io_handle_t output ,
audio_stream_type_t stream ,
audio_session_t session )
void AudioPolicyService : : doReleaseOutput ( audio_port_handle_t portId )
{
ALOGV ( " doReleaseOutput from tid %d " , gettid ( ) ) ;
Mutex : : Autolock _l ( mLock ) ;
const ssize_t index = mAudioPlaybackClients . indexOfKey ( portId ) ;
if ( index < 0 ) {
ALOGE ( " %s AudioTrack client not found for portId %d " , __FUNCTION__ , portId ) ;
return ;
}
sp < AudioPlaybackClient > client = mAudioPlaybackClients . valueAt ( index ) ;
mAudioRecordClients . removeItem ( portId ) ;
// called from internal thread: no need to clear caller identity
mAudioPolicyManager - > releaseOutput ( output , stream , session ) ;
mAudioPolicyManager - > releaseOutput (
client - > io , client - > stream , client - > session ) ;
}
status_t AudioPolicyService : : getInputForAttr ( const audio_attributes_t * attr ,
@ -403,12 +438,8 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
return status ;
}
sp < AudioRecordClient > client =
new AudioRecordClient ( * attr , * input , uid , pid , opPackageName , session ) ;
client - > active = false ;
client - > isConcurrent = false ;
client - > isVirtualDevice = false ; //TODO : update from APM->getInputForAttr()
client - > deviceId = * selectedDeviceId ;
sp < AudioRecordClient > client = new AudioRecordClient ( * attr , * input , uid , pid , session ,
* selectedDeviceId , opPackageName ) ;
mAudioRecordClients . add ( * portId , client ) ;
}
@ -497,7 +528,7 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc
{
AutoCallerClear acc ;
status = mAudioPolicyManager - > startInput (
client - > i nput , client - > session , * silenced , & concurrency ) ;
client - > i o , client - > session , * silenced , & concurrency ) ;
}
@ -610,7 +641,7 @@ status_t AudioPolicyService::stopInput(audio_port_handle_t portId)
// finish the recording app op
finishRecording ( client - > opPackageName , client - > uid ) ;
AutoCallerClear acc ;
return mAudioPolicyManager - > stopInput ( client - > i nput , client - > session ) ;
return mAudioPolicyManager - > stopInput ( client - > i o , client - > session ) ;
}
void AudioPolicyService : : releaseInput ( audio_port_handle_t portId )
@ -635,15 +666,15 @@ void AudioPolicyService::releaseInput(audio_port_handle_t portId)
}
if ( audioPolicyEffects ! = 0 ) {
// release audio processors from the input
status_t status = audioPolicyEffects - > releaseInputEffects ( client - > i nput , client - > session ) ;
status_t status = audioPolicyEffects - > releaseInputEffects ( client - > i o , client - > session ) ;
if ( status ! = NO_ERROR ) {
ALOGW ( " Failed to release effects on input %d " , client - > i nput ) ;
ALOGW ( " Failed to release effects on input %d " , client - > i o ) ;
}
}
{
Mutex : : Autolock _l ( mLock ) ;
AutoCallerClear acc ;
mAudioPolicyManager - > releaseInput ( client - > i nput , client - > session ) ;
mAudioPolicyManager - > releaseInput ( client - > i o , client - > session ) ;
}
}