| /* |
| * 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. |
| */ |
| |
| |
| #ifndef CTSAUDIO_TASKCASE_H |
| #define CTSAUDIO_TASKCASE_H |
| |
| #include <stdint.h> |
| #include <map> |
| #include <list> |
| #include <utility> |
| #include <utils/String8.h> |
| #include <utils/StrongPointer.h> |
| #include "Log.h" |
| #include "audio/Buffer.h" |
| #include "TaskGeneric.h" |
| |
| class RemoteAudio; |
| class ClientInterface; |
| |
| class TaskCase: public TaskGeneric { |
| public: |
| TaskCase(); |
| virtual ~TaskCase(); |
| virtual bool addChild(TaskGeneric* child); |
| virtual TaskGeneric::ExecutionResult run(); |
| |
| bool getCaseName(android::String8& name) const; |
| |
| bool registerBuffer(const android::String8& name, android::sp<Buffer>& buffer); |
| // update already existing buffer. Actually the old buffer will be deleted. |
| bool updateBuffer(const android::String8& name, android::sp<Buffer>& buffer); |
| /// find buffer with given id. sp will be NULL if not found |
| android::sp<Buffer> findBuffer(const android::String8& name); |
| typedef std::pair<android::String8, android::sp<Buffer> > BufferPair; |
| /// find all buffers with given regular expression. returns NULL if not found |
| std::list<BufferPair>* findAllBuffers(const android::String8& re); |
| |
| android::sp<RemoteAudio>& getRemoteAudio(); |
| |
| class Value { |
| public: |
| enum Type { |
| ETypeDouble, |
| ETypeI64 |
| }; |
| inline Value(): mType(ETypeDouble) {}; |
| inline Value(Type type): mType(type) {}; |
| inline Value(double val): mType(ETypeDouble) { |
| setDouble(val); |
| }; |
| inline Value(int64_t val): mType(ETypeI64) { |
| setInt64(val); |
| }; |
| inline Type getType() { |
| return mType; |
| }; |
| inline void setType(Type type) { |
| mType = type; |
| }; |
| inline void setDouble(double val) { |
| mValue[0] = val; |
| mType = ETypeDouble; |
| //LOGD("Value set %f 0x%x", val, this); |
| }; |
| inline double getDouble() { |
| //LOGD("Value get %f 0x%x", mValue[0], this); |
| return mValue[0]; |
| }; |
| inline void setInt64(int64_t val) { |
| int64_t* data = reinterpret_cast<int64_t*>(mValue); |
| data[0] = val; |
| mType = ETypeI64; |
| //LOGD("Value set %lld 0x%x", val, this); |
| } |
| inline int64_t getInt64() { |
| int64_t* data = reinterpret_cast<int64_t*>(mValue); |
| //LOGD("Value get %lld 0x%x", data[0], this); |
| return data[0]; |
| } |
| void* getPtr() { |
| return mValue; |
| } |
| bool operator ==(const Value& b) const { |
| return ((mValue[0] == b.mValue[0]) && (mType == b.mType)); |
| }; |
| |
| private: |
| double mValue[1]; |
| Type mType; |
| }; |
| |
| bool registerValue(const android::String8& name, Value& val); |
| bool updateValue(const android::String8& name, Value& val); |
| bool findValue(const android::String8& name, Value& val); |
| typedef std::pair<android::String8, Value> ValuePair; |
| /// find all Values with given regular expression. returns NULL if not found |
| std::list<ValuePair>* findAllValues(const android::String8& re); |
| |
| bool registerIndex(const android::String8& name, int value = -1); |
| bool updateIndex(const android::String8& name, int value); |
| bool findIndex(const android::String8& name, int& val); |
| typedef std::pair<android::String8, int> IndexPair; |
| /// find all Indices with given regular expression. returns NULL if not found |
| std::list<IndexPair>* findAllIndices(const android::String8& re); |
| |
| /** |
| * Translate variable name like $i into index variable |
| * All xxxValue and xxxBuffer calls do translation inside. |
| */ |
| bool translateVarName(const android::String8& orig, android::String8& translated); |
| |
| void setDetails(android::String8 details); |
| const android::String8& getDetails() const; |
| private: |
| void releaseRemoteAudio(); |
| |
| private: |
| std::map<android::String8, android::sp<Buffer> > mBufferList; |
| std::map<android::String8, int> mIndexList; |
| std::map<android::String8, Value> mValueList; |
| ClientInterface* mClient; |
| android::String8 mDetails; |
| }; |
| |
| |
| #endif // CTSAUDIO_TASKCASE_H |