dmc发起一个action,dmr针对这个action作出反映,或者设置变量,或者给变量赋值。
dmc这边得到action的response,即可获取其中变量的值。
开源代码中,dmc-->dmr, dmr--->dmc这两部分的数据通道都已经有了。
我们要做的主要工作,是在dmr端设置变量或者给变量赋值。思路如下:
c++提供读写数据的接口,读写数据都要设置标记,java写数据,c++读数据。
这部分代码如下:
class DataBuffer
{
public:
DataBuffer() {setFlag(false);}
/* java write data */
void writeData(int position,int duration)
{
//wait until flag become false(data has been read.)
while(getFlag()==true)
{
}
NPT_AutoLock lock(m_dataLock);
m_position = position;
m_duration = duration;
setFlag(true);
}
/* c++ read data */
int readPosition()
{
//wait until flag become true(new data has been written.)
while(getFlag()==false)
{
}
NPT_AutoLock lock(m_dataLock);
setFlag(false);
return m_position;
}
int readDuration()
{
//wait until flag become true(new data has been written.)
while(getFlag()==false)
{
}
NPT_AutoLock lock(m_dataLock);
setFlag(false);
return m_duration;
}
/* setFlag m_flag == false时可写,m_flag==true时可读 */
void setFlag(bool flag)
{
NPT_AutoLock lock(m_flagLock);
m_flag = flag;
}
/* getFlag */
bool getFlag()
{
NPT_AutoLock lock(m_flagLock);
return m_flag;
}
private:
bool m_flag;
NPT_Mutex m_flagLock;
int m_position;
int m_duration;
NPT_Mutex m_dataLock;
};
原来获取position和duration都是发起同样的action,在response里获取值。但是在获取position时是正确的,duration调用一次却能引起不停地调用。这一点我始终不解。
后来采用在获取position和duration之前,发起一个action,然后只是简单地获取值,这种方法已经验证是可以的。
最简单的接口是dmc--->dmr只需要单方向通知的接口,例如play,pause,next等,
稍微复杂一点的接口为dmr控制接口,例如获取音量,获取静音状态。设置音量后,会将音量保存在dmr端的相应变量中,需要dmr通知java作出相应的动作方可体现出音量的变化,否则,仅仅是一个变量值的改变而已,并不能作用到音量大小上。获取音量,则是从dmr端的变量中直接读值。
最复杂的接口为获取动态信息的一些接口。比如在本文开始讲的获取当前播放文件的进度条位置以及总时长的接口。
代码改写:
class DataBuffer
{
public:
DataBuffer() {setFlag(false);}
/* java write data */
void writeData(int position,int duration)
{
//wait until flag become false(data has been read.)
while(getFlag()==true)
{
usleep(200*1000);//sleep for 200 milliseconds.
}
NPT_AutoLock lock(m_dataLock);
m_position = position;
m_duration = duration;
setFlag(true);
}
/* c++ read data */
int readData(int &position, int &duration)
{
//wait until flag become true(new data has been written.)
while(getFlag()==false)
{
usleep(200*1000);//sleep for 200 milliseconds.
}
NPT_AutoLock lock(m_dataLock);
position=m_position;
duration=m_duration;
setFlag(false);
return 0;
}
/* setFlag m_flag == false时可写,m_flag==true时可读 */
void setFlag(bool flag)
{
NPT_AutoLock lock(m_flagLock);
m_flag = flag;
}
/* getFlag */
bool getFlag()
{
NPT_AutoLock lock(m_flagLock);
return m_flag;
}
private:
bool m_flag;
NPT_Mutex m_flagLock;
int m_position;
int m_duration;
NPT_Mutex m_dataLock;
};