?? compression.cpp
字號:
HACMSTREAM hstr = NULL;
mmr = acmStreamOpen(&hstr,
NULL, // any driver
&m_wfSrc, // source format
pwfPCM, // destination format
NULL, // no filter
NULL, // no callback
0, // instance data (not used)
ACM_STREAMOPENF_NONREALTIME); // flags
if (mmr) {
AfxMessageBox("Failed to open a stream to do PCM to PCM conversion\n");
return 0;
}
// fill in the conversion info
ACMSTREAMHEADER strhdr;
memset(&strhdr, 0, sizeof(strhdr));
strhdr.cbStruct = sizeof(strhdr);
strhdr.pbSrc = m_pSrcData; // the source data to convert
strhdr.cbSrcLength = m_dwSrcBytes;
strhdr.pbDst = pDst1Data;
strhdr.cbDstLength = dwDst1Bytes;
// prep the header
mmr = acmStreamPrepareHeader(hstr, &strhdr, 0);
// convert the data
TRACE("Converting to intermediate PCM format...\n");
mmr = acmStreamConvert(hstr, &strhdr, 0);
if (mmr) {
AfxMessageBox("Failed to do PCM to PCM conversion\n");
return 0;
}
TRACE("Converted OK\n");
// close the stream
acmStreamClose(hstr, 0);
///////////////////////////////////////////////////////////////////////////////////
// convert the intermediate PCM format to the final format
// open the driver
HACMDRIVER had = NULL;
mmr = acmDriverOpen(&had, hadid, 0);
if (mmr) {
AfxMessageBox("Failed to open driver\n");
return 0;
}
// open the conversion stream
// Note the use of the ACM_STREAMOPENF_NONREALTIME flag. Without this
// some software compressors will report error 512 - not possible
mmr = acmStreamOpen(&hstr,
had, // driver handle
pwfPCM, // source format
pwfDrv, // destination format
NULL, // no filter
NULL, // no callback
0, // instance data (not used)
ACM_STREAMOPENF_NONREALTIME ); // flags
if (mmr) {
AfxMessageBox("Failed to open a stream to do PCM to driver format conversion\n");
return 0;
}
// fill in the conversion info
ACMSTREAMHEADER strhdr2;
memset(&strhdr2, 0, sizeof(strhdr2));
strhdr2.cbStruct = sizeof(strhdr2);
strhdr2.pbSrc = pDst1Data; // the source data to convert
strhdr2.cbSrcLength = dwDst1Bytes;
strhdr2.pbDst = pDst2Data;
strhdr2.cbDstLength = dwDst2Bytes;
// prep the header
mmr = acmStreamPrepareHeader(hstr, &strhdr2, 0);
// convert the data
TRACE("Converting to final format...\n");
mmr = acmStreamConvert(hstr, &strhdr2, 0);
if (mmr) {
AfxMessageBox("Failed to do PCM to driver format conversion\n");
return 0;
}
TRACE("Converted OK\n");
// close the stream and driver
mmr = acmStreamClose(hstr, 0);
mmr = acmDriverClose(had, 0);
// show the conversion stats
TRACE("Source wave had %lu bytes\n", m_dwSrcBytes);
TRACE("Converted wave has %lu bytes\n", strhdr2.cbDstLengthUsed);
TRACE("Compression ratio is %f\n", (double)m_dwSrcBytes / (double) strhdr2.cbDstLengthUsed);
length=strhdr2.cbDstLengthUsed;
return length;
}
else{
if(detLength<length){
AfxMessageBox("Error using the function!");
return 0;
}
memcpy(pDetData,pDst2Data,length);
return length;
}
}
BOOL CCompression::ConvertSend(SOCKET s, SOCKADDR_IN addr)
{
MyConvert(TRUE,NULL,0);
int iError=sendto(s,(char *)pDst2Data,length,0,(LPSOCKADDR)&addr,sizeof(addr));
if(iError==SOCKET_ERROR)
return FALSE;
return TRUE;
}
void CCompression::SetDstSamples(long bytes, unsigned char *pDstData)
{
dwDst2Bytes=bytes;
pDst2Data=(BYTE*)malloc(dwDst2Bytes);
memcpy(pDst2Data,pDstData,dwDst2Bytes);
}
BOOL CCompression::PrepareSpace(BOOL bCompression)
{
if(bCompression){
dwDst1Samples = m_dwSrcSamples * pwfPCM->nSamplesPerSec / m_wfSrc.nSamplesPerSec;
dwDst1Bytes = dwDst1Samples * pwfPCM->wBitsPerSample / 8;
pDst1Data =(BYTE*)malloc(dwDst1Bytes);
#ifdef _DEBUG
memset(pDst1Data, 0, dwDst1Bytes);
#endif
dwDst2Bytes = pwfDrv->nAvgBytesPerSec * dwDst1Samples / pwfPCM->nSamplesPerSec;
dwDst2Bytes = dwDst2Bytes * 3 / 2; // add a little room
pDst2Data =(BYTE*)malloc(dwDst2Bytes);
#ifdef _DEBUG
memset(pDst2Data, 0, dwDst2Bytes);
#endif
}
else{
dwDst1Samples=pwfPCM->nSamplesPerSec*dwDst2Bytes/pwfDrv->nAvgBytesPerSec;
dwDst1Bytes = dwDst1Samples* 3 / 2; // add a little room
pDst1Data = (BYTE*)malloc(dwDst1Bytes);
#ifdef _DEBUG
memset(pDst1Data, 0, dwDst1Bytes);
#endif
m_dwSrcSamples=dwDst1Samples*m_wfSrc.nSamplesPerSec/pwfPCM->nSamplesPerSec;
m_dwSrcBytes=m_dwSrcSamples*m_wfSrc.wBitsPerSample / 8;
m_pSrcData = (BYTE*)malloc(m_dwSrcBytes);
#ifdef _DEBUG
memset(m_pSrcData, 0, m_dwSrcBytes);
#endif
}
return TRUE;
}
long CCompression::UnConvert(BOOL bQuery, unsigned char *pSrcData, long bytes)
{
if(bQuery){
MMRESULT mmr;
HACMSTREAM hstr = NULL;
HACMDRIVER had = NULL;
mmr = acmDriverOpen(&had, hadid, 0);
if (mmr) {
AfxMessageBox("Failed to open driver\n");
return 0;
}
// open the conversion stream
// Note the use of the ACM_STREAMOPENF_NONREALTIME flag. Without this
// some software compressors will report error 512 - not possible
mmr = acmStreamOpen(&hstr,
had, // driver handle
pwfDrv, // source format
pwfPCM, // destination format
NULL, // no filter
NULL, // no callback
0, // instance data (not used)
ACM_STREAMOPENF_NONREALTIME ); // flags
if (mmr) {
AfxMessageBox("Failed to open a stream to do PCM to driver format conversion\n");
return 0;
}
// fill in the conversion info
ACMSTREAMHEADER strhdr2;
memset(&strhdr2, 0, sizeof(strhdr2));
strhdr2.cbStruct = sizeof(strhdr2);
strhdr2.pbSrc = pDst2Data; // the source data to convert
strhdr2.cbSrcLength = dwDst2Bytes;
strhdr2.pbDst = pDst1Data;
strhdr2.cbDstLength = dwDst1Bytes;
// prep the header
mmr = acmStreamPrepareHeader(hstr, &strhdr2, 0);
// convert the data
TRACE("Converting to final format...\n");
mmr = acmStreamConvert(hstr, &strhdr2, 0);
if (mmr) {
AfxMessageBox("Failed to do PCM to driver format conversion\n");
return 0;
}
TRACE("Converted OK\n");
// close the stream and driver
mmr = acmStreamClose(hstr, 0);
mmr = acmDriverClose(had, 0);
DWORD tmpBytes=strhdr2.cbDstLengthUsed;
// show the conversion stats
TRACE("Source wave had %lu bytes\n", m_dwSrcBytes);
TRACE("Converted wave has %lu bytes\n", strhdr2.cbDstLengthUsed);
TRACE("Compression ratio is %f\n", (double)m_dwSrcBytes / (double) strhdr2.cbDstLengthUsed);
mmr = acmStreamOpen(&hstr,
NULL, // any driver
pwfPCM, // source format
&m_wfSrc, // destination format
NULL, // no filter
NULL, // no callback
0, // instance data (not used)
ACM_STREAMOPENF_NONREALTIME ); // flags
if (mmr) {
AfxMessageBox("Failed to open a stream to do PCM to PCM conversion\n");
return 0;
}
// fill in the conversion info
ACMSTREAMHEADER strhdr;
memset(&strhdr, 0, sizeof(strhdr));
strhdr.cbStruct = sizeof(strhdr);
strhdr.pbSrc = pDst1Data; // the source data to convert
strhdr.cbSrcLength = tmpBytes;
strhdr.pbDst = m_pSrcData;
strhdr.cbDstLength = m_dwSrcBytes;
// prep the header
mmr = acmStreamPrepareHeader(hstr, &strhdr, 0);
// convert the data
TRACE("Converting to intermediate PCM format...\n");
mmr = acmStreamConvert(hstr, &strhdr, 0);
if (mmr) {
AfxMessageBox("Failed to do PCM to PCM conversion\n");
return 0;
}
TRACE("Converted OK\n");
// close the stream
acmStreamClose(hstr, 0);
///////////////////////////////////////////////////////////////////////////////////
// convert the intermediate PCM format to the final format
// open the driver
unlength=strhdr.cbDstLengthUsed;
return unlength;
}
else{
if(bytes<unlength){
memcpy(pSrcData,m_pSrcData,bytes);
return 0;
}
memcpy(pSrcData,m_pSrcData,unlength);
return unlength;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -