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;
};