/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ #include "task/TaskCase.h" #include "StringUtil.h" #include "task/TaskOutput.h" #include "audio/AudioRemote.h" #include "audio/RemoteAudio.h" TaskOutput::TaskOutput() : TaskAsync(TaskGeneric::ETaskOutput), mWaitForCompletion(false) { } TaskOutput::~TaskOutput() { } bool TaskOutput::parseAttribute(const android::String8& name, const android::String8& value) { if (StringUtil::compare(name, "waitforcompletion") == 0) { if (StringUtil::compare(value, "1") == 0) { mWaitForCompletion = true; } return true; } return TaskAsync::parseAttribute(name, value); } TaskGeneric::ExecutionResult TaskOutput::start() { bool localDevice = (mDeviceType == TaskAsync::EDeviceHost); android::sp<AudioHardware> hw = AudioHardware::createAudioHw(localDevice, true, getTestCase()); if (hw.get() == NULL) { LOGE("cannot create Audio HW"); return TaskGeneric::EResultError; } if (!hw->prepare(AudioHardware::ESampleRate_44100, mVolume, mMode)) { LOGE("prepare failed"); return TaskGeneric::EResultError; } android::sp<Buffer> buffer = getTestCase()->findBuffer(mId); if (buffer.get() == NULL) { LOGE("cannot find buffer %s", mId.string()); return TaskGeneric::EResultError; } buffer->restart(); // reset to play from beginning if (localDevice) { if (!hw->startPlaybackOrRecord(buffer)) { LOGE("play failed"); return TaskGeneric::EResultError; } } else { int id = getTestCase()->getRemoteAudio()->getDataId(mId); if (id < 0) { return TaskGeneric::EResultError; } AudioRemotePlayback* remote = reinterpret_cast<AudioRemotePlayback*>(hw.get()); if (!remote->startPlaybackForRemoteData(id, buffer->isStereo())) { return TaskGeneric::EResultError; } } // now store sp mHw = hw; return TaskGeneric::EResultOK; } TaskGeneric::ExecutionResult TaskOutput::complete() { bool result = true; if (mWaitForCompletion) { result = mHw->waitForCompletion(); } mHw->stopPlaybackOrRecord(); mHw.clear(); if (!result) { LOGE("waitForCompletion failed"); return TaskGeneric::EResultError; } return TaskGeneric::EResultOK; }