1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 #include <UniquePtr.h> 18 #include "Log.h" 19 #include "audio/AudioSignalFactory.h" 20 #include "audio/RemoteAudio.h" 21 #include "StringUtil.h" 22 #include "task/TaskCase.h" 23 #include "task/TaskSound.h" 24 25 static const android::String8 STR_ID("id"); 26 static const android::String8 STR_TYPE("type"); 27 28 TaskSound::TaskSound() 29 : TaskGeneric(TaskGeneric::ETaskSound), 30 mPreload(false) 31 { 32 const android::String8* list[] = {&STR_ID, &STR_TYPE, NULL}; 33 registerSupportedStringAttributes(list); 34 } 35 36 TaskSound::~TaskSound() 37 { 38 39 } 40 41 bool TaskSound::parseAttribute(const android::String8& name, const android::String8& value) 42 { 43 if (StringUtil::compare(name, "preload") == 0) { 44 if (StringUtil::compare(value, "1") == 0) { 45 mPreload = true; 46 } 47 return true; 48 } 49 return TaskGeneric::parseAttribute(name, value); 50 } 51 52 TaskGeneric::ExecutionResult TaskSound::run() 53 { 54 android::String8 id; 55 if (!findStringAttribute(STR_ID, id)) { 56 LOGE("TaskSound::run %s string not found", STR_ID.string()); 57 return TaskGeneric::EResultError; 58 } 59 android::String8 type; 60 if (!findStringAttribute(STR_TYPE, type)) { 61 LOGE("TaskSound::run %s string not found", STR_TYPE.string()); 62 return TaskGeneric::EResultError; 63 } 64 UniquePtr<std::vector<android::String8> > tokens(StringUtil::split(type, ':')); 65 if (tokens.get() == NULL) { 66 LOGE("alloc failed"); 67 return TaskGeneric::EResultError; 68 } 69 android::sp<Buffer> buffer; 70 if (StringUtil::compare(tokens->at(0), "file") == 0) { 71 if (tokens->size() != 2) { 72 LOGE("Wrong number of parameters %d", tokens->size()); 73 } 74 buffer = Buffer::loadFromFile(tokens->at(1)); 75 } else if (StringUtil::compare(tokens->at(0), "sin") == 0) { 76 if (tokens->size() != 4) { 77 LOGE("Wrong number of parameters %d", tokens->size()); 78 } 79 int amplitude = atoi(tokens->at(1).string()); 80 int freq = atoi(tokens->at(2).string()); 81 int time = atoi(tokens->at(3).string()); 82 int samples = time * AudioHardware::ESampleRate_44100 / 1000; 83 buffer = AudioSignalFactory::generateSineWave(AudioHardware::E2BPS, amplitude, 84 AudioHardware::ESampleRate_44100, freq, samples, true); 85 } else if (StringUtil::compare(tokens->at(0), "random") == 0) { 86 // TODO FIXME it does not seem to work well. 87 if (tokens->size() != 3) { 88 LOGE("Wrong number of parameters %d", tokens->size()); 89 } 90 int amplitude = atoi(tokens->at(1).string()); 91 int time = atoi(tokens->at(2).string()); 92 int samples = time * AudioHardware::ESampleRate_44100 / 1000; 93 buffer = AudioSignalFactory::generateWhiteNoise(AudioHardware::E2BPS, amplitude, 94 samples, true); 95 } else { // unknown word 96 LOGE("TaskSound::run unknown word in type %s", type.string()); 97 // next buffer check will return 98 } 99 100 if (buffer.get() == NULL) { 101 return TaskGeneric::EResultError; 102 } 103 if (!getTestCase()->registerBuffer(id, buffer)) { 104 LOGE("TaskSound::run registering buffer %s failed", id.string()); 105 return TaskGeneric::EResultError; 106 } 107 if (mPreload) { 108 int downloadId; 109 if (!getTestCase()->getRemoteAudio()->downloadData(id, buffer, downloadId)) { 110 return TaskGeneric::EResultError; 111 } 112 LOGI("Downloaded buffer %s to DUT with id %d", id.string(), downloadId); 113 } 114 return TaskGeneric::EResultOK; 115 } 116 117 118 119