/* * 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 <stdlib.h> #include "Log.h" #include "audio/AudioHardware.h" #include "task/TaskCase.h" #include "task/TaskInput.h" TaskInput::TaskInput() : TaskAsync(TaskGeneric::ETaskInput), mRecordingTimeInMs(0) { } TaskInput::~TaskInput() { } bool TaskInput::parseAttribute(const android::String8& name, const android::String8& value) { if (strcmp(name, "time") == 0) { mRecordingTimeInMs = atoi(value); if (mRecordingTimeInMs < 0) { LOGE("TaskInput::parseAttribute invalid recording time %d", mRecordingTimeInMs); return false; } return true; } return TaskAsync::parseAttribute(name, value); } TaskGeneric::ExecutionResult TaskInput::start() { bool localDevice = (mDeviceType == TaskAsync::EDeviceHost); android::sp<AudioHardware> hw = AudioHardware::createAudioHw(localDevice, false, getTestCase()); if (hw.get() == NULL) { LOGE("createAudioHw failed"); return TaskGeneric::EResultError; } // TODO support stereo mode in local later // for now, local is captured in stereo, and it is stored to mono // by keeping only channel 1. // local : stereo only, remote : mono only size_t bufferSize = mRecordingTimeInMs * AudioHardware::ESampleRate_44100 / 1000 * (localDevice ? 4 : 2); android::sp<Buffer> buffer(new Buffer(bufferSize, bufferSize, localDevice)); if (buffer.get() == NULL) { LOGE("buffer alloc failed"); return TaskGeneric::EResultError; } if (!hw->prepare(AudioHardware::ESampleRate_44100, mVolume, mMode)) { LOGE("prepare failed"); return TaskGeneric::EResultError; } if (!hw->startPlaybackOrRecord(buffer)) { LOGE("record failed"); return TaskGeneric::EResultError; } // now store sp mHw = hw; mBuffer = buffer; return TaskGeneric::EResultOK; } TaskGeneric::ExecutionResult TaskInput::complete() { bool result = mHw->waitForCompletion(); mHw->stopPlaybackOrRecord(); mHw.clear(); if (!result) { LOGE("waitForComletion failed"); return TaskGeneric::EResultError; } // TODO: need to keep stereo for local if in stereo mode // For now, convert to mono if it is stereo if (mBuffer->isStereo()) { mBuffer->changeToMono(Buffer::EKeepCh0); } if (!getTestCase()->registerBuffer(mId, mBuffer)) { if (!getTestCase()->updateBuffer(mId, mBuffer)) { LOGE("cannot register/update buffer %s", mId.string()); return TaskGeneric::EResultError; } } return TaskGeneric::EResultOK; }