/*
* 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