summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp14
-rw-r--r--services/audiopolicy/service/AudioPolicyService.cpp29
-rw-r--r--services/audiopolicy/service/AudioPolicyService.h14
3 files changed, 57 insertions, 0 deletions
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index a228798..c0d3866 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -187,6 +187,20 @@ status_t AudioPolicyService::startOutput(audio_io_handle_t output,
return NO_INIT;
}
ALOGV("startOutput()");
+ return mOutputCommandThread->startOutputCommand(output, stream, session);
+}
+
+status_t AudioPolicyService::doStartOutput(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session)
+{
+ if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
+ return BAD_VALUE;
+ }
+ if (mAudioPolicyManager == NULL) {
+ return NO_INIT;
+ }
+ ALOGV("doStartOutput()");
sp<AudioPolicyEffects>audioPolicyEffects;
{
Mutex::Autolock _l(mLock);
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 41dd40c..12cca65 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -478,6 +478,19 @@ bool AudioPolicyService::AudioCommandThread::threadLoop()
data->mVolume);
command->mStatus = AudioSystem::setVoiceVolume(data->mVolume);
}break;
+ case START_OUTPUT: {
+ StartOutputData *data = (StartOutputData *)command->mParam.get();
+ ALOGV("AudioCommandThread() processing start output %d",
+ data->mIO);
+ svc = mService.promote();
+ if (svc == 0) {
+ command->mStatus = UNKNOWN_ERROR;
+ break;
+ }
+ mLock.unlock();
+ command->mStatus = svc->doStartOutput(data->mIO, data->mStream, data->mSession);
+ mLock.lock();
+ }break;
case STOP_OUTPUT: {
StopOutputData *data = (StopOutputData *)command->mParam.get();
ALOGV("AudioCommandThread() processing stop output %d",
@@ -714,6 +727,22 @@ status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand(float volume
return sendCommand(command, delayMs);
}
+status_t AudioPolicyService::AudioCommandThread::startOutputCommand(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session)
+{
+ sp<AudioCommand> command = new AudioCommand();
+ command->mCommand = START_OUTPUT;
+ sp<StartOutputData> data = new StartOutputData();
+ data->mIO = output;
+ data->mStream = stream;
+ data->mSession = session;
+ command->mParam = data;
+ command->mWaitStatus = true;
+ ALOGV("AudioCommandThread() adding start output %d", output);
+ return sendCommand(command);
+}
+
void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_io_handle_t output,
audio_stream_type_t stream,
audio_session_t session)
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index a0d5aa2..d11294b 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -202,6 +202,9 @@ public:
audio_io_handle_t *handle);
virtual status_t stopAudioSource(audio_io_handle_t handle);
+ status_t doStartOutput(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session);
status_t doStopOutput(audio_io_handle_t output,
audio_stream_type_t stream,
audio_session_t session);
@@ -249,6 +252,7 @@ private:
SET_VOLUME,
SET_PARAMETERS,
SET_VOICE_VOLUME,
+ START_OUTPUT,
STOP_OUTPUT,
RELEASE_OUTPUT,
CREATE_AUDIO_PATCH,
@@ -277,6 +281,9 @@ private:
status_t parametersCommand(audio_io_handle_t ioHandle,
const char *keyValuePairs, int delayMs = 0);
status_t voiceVolumeCommand(float volume, int delayMs = 0);
+ status_t startOutputCommand(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session);
void stopOutputCommand(audio_io_handle_t output,
audio_stream_type_t stream,
audio_session_t session);
@@ -349,6 +356,13 @@ private:
float mVolume;
};
+ class StartOutputData : public AudioCommandData {
+ public:
+ audio_io_handle_t mIO;
+ audio_stream_type_t mStream;
+ audio_session_t mSession;
+ };
+
class StopOutputData : public AudioCommandData {
public:
audio_io_handle_t mIO;