mmidsmwav.h
1.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#ifdef __MMI_DSM_NEW__
extern unsigned char dsmLoopPCM;
extern long int dsmReadAddr;
extern long int dsmWriteAddr;
kal_int32 dsmAudGetBytes(MHdl *hdl, STFSAL *pstFSAL, kal_uint32 uLen, kal_uint8 *pbBuf);
static void dsmWavDecodeTask( void *data );
static void wavUpdateDataLen( wavMediaHdl *ihdl, kal_uint32 *uMBufLen);
kal_int32 dsmAudGetBytes(MHdl *hdl, STFSAL *pstFSAL, kal_uint32 uLen, kal_uint8 *pbBuf)
{
kal_int32 actLen =0;
kal_int32 leftLen = 0;
kal_int32 temp =0;
if(dsmReadAddr == dsmWriteAddr)
return 0;
if(dsmWriteAddr > dsmReadAddr)
{
leftLen= dsmWriteAddr-dsmReadAddr;
actLen = leftLen >uLen?uLen:leftLen;
memcpy(pbBuf,(void *)dsmReadAddr,actLen);
dsmReadAddr+=actLen;
return actLen;
}
else if(dsmWriteAddr < dsmReadAddr)
{
leftLen = (kal_uint32)pstFSAL->uRamFileSize -(dsmReadAddr-(kal_uint32)pstFSAL->pbFile);
if(leftLen >= uLen)
{
memcpy(pbBuf,(void *)dsmReadAddr,uLen);
dsmReadAddr+=uLen;
return uLen;
}
else
{
memcpy(pbBuf,(void *)dsmReadAddr,leftLen);
actLen = leftLen;
dsmReadAddr = (kal_uint32)pstFSAL->pbFile;
leftLen = uLen-actLen; /*目标buf 中还有那么大的空间可以继续放数据*/
temp = dsmWriteAddr-dsmReadAddr;
if(temp <= 0)
{
return actLen;
}
else
{
leftLen = temp>leftLen?leftLen:temp;
memcpy(pbBuf+actLen,(void *)dsmReadAddr,leftLen);
dsmReadAddr += leftLen;
return (actLen+leftLen);
}
}
}
return 0;
}
static void dsmWavDecodeTask( void *data )
{
MHdl *hdl = (MHdl *)data;
wavMediaHdl *ihdl = (wavMediaHdl *) hdl;
{
kal_uint8 *pBuf;
kal_uint32 uMBufLen;
while(1)
{
hdl->GetWriteBuffer(hdl, &pBuf, &uMBufLen);
if(uMBufLen == 0 || hdl->eof)
break;
uMBufLen = dsmAudGetBytes(hdl,ihdl->pstFSAL,uMBufLen, pBuf);
if(uMBufLen == 0 )
break;
wavUpdateDataLen( ihdl, &uMBufLen);
hdl->WriteDataDone( hdl, uMBufLen );
}
}
hdl->waiting = KAL_FALSE;
}
#endif