6138|15

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC 下录音问题 [复制链接]

我通过修改public下的wavrec,可实现录音,但是最大只能录16M左右的文件,也就是100S以内,我的采样率44100,通道为2,怎样才能录得较大的WAV文件呢,
至少也得5M左右

最新回复

搞定,结贴  详情 回复 发表于 2008-11-17 20:18
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
晕,是LS写错了,还是我看错了。

16M vs 5M

这个问题,研究一下代码应该就可以解决的
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
大概看了一下代码,感觉好像是缓冲区分配的大小有关,LS再好好研究一下
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
应该没有这个限制!
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
不好意思,是最少要求5分钟
大概是50M吧

 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
一般录音的采样率要低一点吧,44.1K录出来的文件会很吓人的
而且修改那个Sample代码可以录长时间的,当时做过录30分钟的,应该没有问题
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
hzdysymbol 前辈:
能否给个思路,你如何将sample改得长时间录音的?


RecordWaveFile (PCTSTR pszFilename, DWORD dwDeviceId, PWAVEFORMATEX pwfx, DWORD dwDuration)

我的dwDuration 的值为大于100000的时候,也就是录音时间大于100s的时候

   dwBufferSize = (dwDuration * pwfx->nSamplesPerSec / 1000) * pwfx->nBlockAlign;

    RETAILMSG(1, (TEXT("Recording %5d ms to \"%s\": %c%02d %5dHz (%8d bytes)\r\n")
        , dwDuration
        , pszFilename
        , pwfx->nChannels == 2 ? L'S' : L'M'
        , pwfx->wBitsPerSample
        , pwfx->nSamplesPerSec
        , dwBufferSize
        ));
输出的dwbuffersize的值就不对,正常应该是44100×4×100,可是它只得到400多K的值,不知道什么原因造成?
难道command line 中-t 100000 这个时间值超范围了吗?代码里也没有这个时间限制啊?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
长时间录音是我们做AP的人写的代码,我也不太清楚是怎么修改的
不过我估计你用44.1K的采样率录音的话,Sample代码是一次性申请Buffer,那样录长时间的话估计是会有问题的
所以建议开两个Buffer,交替录,然后存进同一个文件,这样就可以解决这个问题
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
多开几个buffer效果会好点
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
CE中申请大内存要特别注意,建议申请两个BUFFER,录满一个存到文件中,交替录音
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
下面是一个录音的封装类,我把几个文件合并了,没有调试过,你调试一下,应该很容易了
#pragma once
#include
class CWaveRecorder
{
public:
        enum RECORD_STATE { RS_RUNNING, RS_PAUSED, RS_STOPPED, RS_FLUSHING };        //录音,暂停,停止,清洗缓存

public:
        CWaveRecorder(void);
        ~CWaveRecorder(void);

public:
        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:Init
        // 功能描述:初始化录音环境(录音保存到指定文件)
        //
        // 参 数 表:szWaveFile - 录音保存文件全路径
        //           pWaveEndCallback - 录音结束时调用的回调函数,为NULL则忽略此参数
        //           pParam - 回调函数参数
        //           lpWaveFmt - WAVE音频格式,用于指定采样率等参数,为NULL则使用默认参数
        //           pnErrCode - 用于返回错误码,为NULL时忽略此参数
        //
        // 返 回 值:返回TRUE表示操作成功
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL Init(
                IN const CString &szWaveFile,
                IN WaveEndCallback_T *pWaveEndCallback = NULL,
                IN VOID *pParam = NULL,
                IN LPWAVEFORMATEX lpWaveFmt = NULL,
                OUT INT* pnErrCode = NULL
                );

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:Init
        // 功能描述:初始化录音环境(录音到内存缓冲)
        //
        // 参 数 表:pWaveBuffer - 录音目的内存缓冲长度
        //           dwBufferLength - 录音目的内存缓冲区长度
        //           pWaveEndCallback - 录音结束时调用的回调函数,为NULL则忽略此参数
        //           pParam - 回调函数参数
        //           lpWaveFmt - WAVE音频格式,用于指定采样率等参数,为NULL则使用默认参数
        //           pnErrCode - 用于返回错误码,为NULL时忽略此参数
        //
        // 返 回 值:返回TRUE表示操作成功
        //
        // 附加说明:录音时,将给定缓冲区录满后将自动结束录音,当然同时也会调用结束回调函数
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL Init(
                IN CHAR *pWaveBuffer,
                IN DWORD dwBufferLength,
                IN WaveEndCallback_T *pWaveEndCallback = NULL,
                IN VOID *pParam = NULL,
                IN LPWAVEFORMATEX lpWaveFmt = NULL,
                OUT INT* pnErrCode = NULL
                );

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:Run
        // 功能描述:开始录音
        //
        // 参 数 表:无
        //
        // 返 回 值:返回TRUE表示操作成功
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL Run(void);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:Pause
        // 功能描述:暂停录音
        //
        // 参 数 表:无
        //
        // 返 回 值:返回TRUE表示操作成功
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL Pause(void);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:Resume
        // 功能描述:继续被暂停的录音操作
        //
        // 参 数 表:无
        //
        // 返 回 值:返回TRUE表示操作成功
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL Resume(void);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:Stop
        // 功能描述:停止录音
        //
        // 参 数 表:无
        //
        // 返 回 值:返回TRUE表示操作成功
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL Stop(void);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:GetBufferSize
        // 功能描述:根据录音时间和录音格式计算以缓冲区方式录音时所需的缓冲区长度(字节).
        //
        // 参 数 表:dwTime - 预计要录音的时间(毫秒)
        //           lpWaveFmt - 录音格式参数,为NULL时采用默认格式参数
        //
        // 返 回 值:返回计算结果
        //
        ////////////////////////////////////////////////////////////////////////////////
        static DWORD GetBufferSize(DWORD dwTime, LPWAVEFORMATEX lpWaveFmt = NULL);

        //返回值为毫秒
        int GetRecordedTime(void);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:SetMaxRecordTime
        // 功能描述:设置最大录音时间,录音到此时间后将自动结束,同时调用结束回调函数
        //
        // 参 数 表:dwTime - 最大录音时间(毫秒),默认值为INFINITE(表示仅受磁盘容量或指定缓冲量限制)
        //
        // 返 回 值:设置成功返回TRUE,否则返回FALSE.
        //
        // 附加说明:此函数只有在Init()函数被执行后调用才有效
        //
        ////////////////////////////////////////////////////////////////////////////////
        BOOL SetMaxRecordTime(DWORD dwTime);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:GetRecordedDataLength
        // 功能描述:获取当前已录制WAVE音频数据长度(不包含格式信息头)
        //
        // 参 数 表:无
        //
        // 返 回 值:返回当前已录制的音频数据长度(字节)
        //
        // 附加说明:如果录音过程没有结束,获取到的结果不一定准确。
        //
        ////////////////////////////////////////////////////////////////////////////////
        DWORD GetRecordedDataLength(void);

        ////////////////////////////////////////////////////////////////////////////////
        // 函数名称:GetRecordState
        // 功能描述:获取录音状态
        //
        // 参 数 表:无
        //
        // 返 回 值:返回当前录音状态
        //
        ////////////////////////////////////////////////////////////////////////////////
        RECORD_STATE GetRecordState(void);

prie:
        BOOL Init(
                IN WaveEndCallback_T *pWaveEndCallback,
                IN VOID *pParam,
                IN LPWAVEFORMATEX lpWaveFmt,
                OUT INT* pnErrCode
                );

        static void CALLBACK OnRecordCallback(HDRVR hdrvr, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
        static void OnMM_WIM_DATA(CWaveRecorder *pThis, LPWAVEHDR pWaveHdr);
        static void OnMM_WIM_CLOSE(CWaveRecorder *pThis);

        static DWORD WINAPI PostStopThread(IN LPVOID lpParam);
        static DWORD WINAPI PauseProcessThread(IN LPVOID lpParam);

        void FreeWaveInBuffer();
        BOOL AllocateWaveInBuffer(void);       
        BOOL AddWaveInBuffer(int nBufferIndex);

prie:
        HANDLE m_hPauseProcessThread;
        HANDLE m_hPostStopThread;
        HANDLE m_hRecorder;
};
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
//CPP文件


#include "WaveRecorder.h"

typedef struct
{
        DWORD dwRiff;        // Type of file header.
        DWORD dwSize;        // Size of file header.
        DWORD dwWave;        // Type of wave.
}RIFF_FILEHEADER,
*PRIFF_FILEHEADER;

//
// 数据块头
//
typedef struct
{
        DWORD dwCKID;        // Type Identification for current chunk header.
        DWORD dwSize;        // Size of current chunk header.
}RIFF_CHUNKHEADER,
*PRIFF_CHUNKHEADER;

//
// 块类型
//
#define RIFF_FILE                mmioFOURCC('R','I','F','F')
#define RIFF_WAVE                mmioFOURCC('W','A','V','E')
#define RIFF_FORMAT                mmioFOURCC('f','m','t',' ')
#define RIFF_CHANNEL        mmioFOURCC('d','a','t','a')

//
// 定义WAVE录音程序私有数据
//
typedef struct tagRECORDER_HANDLER
{
        CWaveRecorder::RECORD_STATE eRecordState;                //录音状态

        CFile stWaveFile;                                //录音目标文件句柄
        CHAR *pRecordBuffer;                        //录音目标缓冲地址
        DWORD nRecordBufferLength;                //录音目标缓冲长度(字节)

        DWORD dwRecordedBytesCount;                //已录音字节数
        DWORD dwMaxRecordTime;                        //用户限制的最大录音时间

        HWAVEIN hWaveIn;                                //录音设备句柄
        WAVEFORMATEX stWaveFormat;                //录音格式

        WAVEHDR *pWaveInHeaderList;                //录音数据采集信息头链
        WORD wWaveInBuffersCount;                //录音数据采集缓冲个数
        WORD wWaveInBufferUsedCount;        //已使用的录音数据采集缓冲个数

        WaveEndCallback_T *pWaveEndCallback;        //录音结束通知回调函数
        VOID *pCallbackParam;                                        //录音结束通知回调函数参数(由调用方输入)
}RECORDER_HANDLER,
*PRECORDER_HANDLER;

CWaveRecorder::CWaveRecorder()
{
        RECORDER_HANDLER *pRecorder;

        m_hPauseProcessThread = NULL;
        m_hPostStopThread = NULL;

        pRecorder = new RECORDER_HANDLER;
        ASSERT(NULL != pRecorder);

        memset(&pRecorder->stWaveFormat, 0, sizeof(WAVEFORMATEX));
        pRecorder->eRecordState = RS_STOPPED;
        pRecorder->pRecordBuffer = NULL;
        pRecorder->nRecordBufferLength = 0;
        pRecorder->dwRecordedBytesCount = 0;
        pRecorder->dwMaxRecordTime = INFINITE;        //默认一直录音(仅受磁盘或缓冲容量限制)
        pRecorder->hWaveIn = NULL;       
        pRecorder->pWaveInHeaderList = NULL;
        pRecorder->wWaveInBuffersCount = 0;
        pRecorder->wWaveInBufferUsedCount = 0;
        pRecorder->pWaveEndCallback = NULL;
        pRecorder->pCallbackParam = NULL;

        m_hRecorder = (HANDLE)pRecorder;
}

CWaveRecorder::~CWaveRecorder()
{
        RECORDER_HANDLER *pRecorder;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        //
        // 停止录音
        //
        Stop();
        if(NULL != m_hPauseProcessThread)
        {
                WaitForSingleObject(m_hPauseProcessThread, INFINITE);
                CloseHandle(m_hPauseProcessThread);
                m_hPauseProcessThread = NULL;
        }

        //
        // 释放WAVE IN缓冲
        //
        FreeWaveInBuffer();

        delete pRecorder;
        m_hRecorder = NULL;
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:Init
// 功能描述:初始化录音环境
//
////////////////////////////////////////////////////////////////////////////////
BOOL CWaveRecorder::Init(
        IN WaveEndCallback_T *pWaveEndCallback,
        IN VOID *pParam,
        IN LPWAVEFORMATEX lpWaveFmt,
        OUT INT* pnErrCode
        )
{
        RECORDER_HANDLER *pRecorder;
        MMRESULT hResult;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        //
        // 初始化录音环境
        //
        if(INVALID_HANDLE_VALUE != pRecorder->stWaveFile)
        {
                pRecorder->stWaveFile.Close();
        }
        pRecorder->pRecordBuffer = NULL;
        pRecorder->nRecordBufferLength = 0;
        pRecorder->dwRecordedBytesCount = 0;

        pRecorder->pWaveEndCallback = pWaveEndCallback;
        pRecorder->pCallbackParam = pParam;

        if(NULL != lpWaveFmt)
        {
                //
                // 接受用户WAVE格式参数
                //
                pRecorder->stWaveFormat = *lpWaveFmt;
        }
        else
        {
                //
                // 设置默认WAVE格式参数
                //
                pRecorder->stWaveFormat.cbSize = 0;
                pRecorder->stWaveFormat.wFormatTag = WAVE_FORMAT_PCM;
                pRecorder->stWaveFormat.wBitsPerSample = 16;
                pRecorder->stWaveFormat.nSamplesPerSec = 11025;
                pRecorder->stWaveFormat.nChannels = 1;
                pRecorder->stWaveFormat.nBlockAlign        = pRecorder->stWaveFormat.nChannels
                                                                                        * pRecorder->stWaveFormat.wBitsPerSample
                                                                                        / 8;
                pRecorder->stWaveFormat.nAvgBytesPerSec        = pRecorder->stWaveFormat.nBlockAlign
                                                                                                * pRecorder->stWaveFormat.nSamplesPerSec;
        }

        //
        // 分配WAVE IN缓冲
        //
        FreeWaveInBuffer();
        pRecorder->wWaveInBuffersCount = 5;
        pRecorder->wWaveInBufferUsedCount = 0;
        if(!AllocateWaveInBuffer())
        {
                if(NULL != pnErrCode)
                {
                        *pnErrCode = ERROR_OUTOFMEMORY;
                }

                return FALSE;
        }

        //
        // 打开录音设备
        //
        hResult = ::waveInOpen(
                                        &pRecorder->hWaveIn,
                                        WAVE_MAPPER,
                                        &pRecorder->stWaveFormat,
                                        (DWORD_PTR)OnRecordCallback,
                                        (DWORD_PTR)this,
                                        CALLBACK_FUNCTION
                                        );
        if(MMSYSERR_NOERROR != hResult)
        {
                FreeWaveInBuffer();

                if(NULL != pnErrCode)
                {
                        *pnErrCode = ERROR_OPEN_FAILED;
                }

                return FALSE;
        }

        pRecorder->eRecordState = RS_STOPPED;

        //
        // 初始化成功
        //
        if(NULL != pnErrCode)
        {
                *pnErrCode = ERROR_SUCCESS;
        }

        return TRUE;
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:Init
// 功能描述:初始化录音环境(录音保存到指定文件)
//
////////////////////////////////////////////////////////////////////////////////
BOOL CWaveRecorder::Init(
        IN const CString &szWaveFile,
        IN WaveEndCallback_T *pWaveEndCallback /* = NULL */,
        IN VOID *pParam /* = NULL */,
        IN LPWAVEFORMATEX lpWaveFmt /* = NULL */,
        OUT INT* pnErrCode /* = NULL */
        )
{
        RECORDER_HANDLER *pRecorder;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        if(!Init(pWaveEndCallback, pParam, lpWaveFmt, pnErrCode))
        {
                return FALSE;
        }

        if(0 >= szWaveFile.GetLength())
        {
                FreeWaveInBuffer();

                //
                // 无效路径
                //
                if(NULL != pnErrCode)
                {
                        *pnErrCode = ERROR_BAD_PATHNAME;
                }

                return FALSE;
        }

        //
        // 创建录音文件
        //
        if(!pRecorder->stWaveFile.Open(
                                                        szWaveFile,
                                                        CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite | CFile::typeBinary
                                                        ))
        {
                FreeWaveInBuffer();

                //
                // 创建文件失败
                //
                if(NULL != pnErrCode)
                {
                        *pnErrCode = ERROR_CREATE_FAILED;
                }

                return FALSE;
        }

        return TRUE;
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:Init
// 功能描述:初始化录音环境(录音到内存缓冲)
//
////////////////////////////////////////////////////////////////////////////////
BOOL CWaveRecorder::Init(
        IN CHAR *pWaveBuffer,
        IN DWORD dwBufferLength,
        IN WaveEndCallback_T *pWaveEndCallback /* = NULL */,
        IN VOID *pParam /* = NULL */,
        IN LPWAVEFORMATEX lpWaveFmt /* = NULL */,
        OUT INT* pnErrCode /* = NULL */
        )
{
        RECORDER_HANDLER *pRecorder;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        if(!Init(pWaveEndCallback, pParam, lpWaveFmt, pnErrCode))
        {
                return FALSE;
        }

        if((NULL == pWaveBuffer)
        || (GetBufferSize(10, lpWaveFmt) >= dwBufferLength)        //缓冲区不够录10毫秒视为无效
        )
        {
                FreeWaveInBuffer();

                //
                // 无效缓冲
                //
                if(NULL != pnErrCode)
                {
                        *pnErrCode = ERROR_INVALID_USER_BUFFER;
                }

                return FALSE;
        }

        pRecorder->pRecordBuffer = pWaveBuffer;
        pRecorder->nRecordBufferLength = dwBufferLength;

        //
        // 初始化成功
        //
        if(NULL != pnErrCode)
        {
                *pnErrCode = ERROR_SUCCESS;
        }

        return TRUE;
}
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

13
 
////////////////////////////////////////////////////////////////////////////////
// 函数名称:AllocateWaveInBuffer
// 功能描述:分配录音所需的全部WAVE IN缓冲
//
////////////////////////////////////////////////////////////////////////////////
BOOL CWaveRecorder::AllocateWaveInBuffer(void)
{
        int nIndex;
        RECORDER_HANDLER *pRecorder;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        ASSERT(0 < pRecorder->wWaveInBuffersCount);
        ASSERT(NULL == pRecorder->pWaveInHeaderList);

        //
        // 分配WAVE IN缓冲链内存
        //
        pRecorder->pWaveInHeaderList = new WAVEHDR[pRecorder->wWaveInBuffersCount];
        if(NULL == pRecorder->pWaveInHeaderList)
        {
                return FALSE;
        }

        //
        // 为WAVE IN缓冲链中各成员分配内存
        //
        for(nIndex = 0; nIndex < pRecorder->wWaveInBuffersCount; nIndex++)
        {
                pRecorder->pWaveInHeaderList[nIndex].dwBufferLength = GetBufferSize(100, &pRecorder->stWaveFormat);
                pRecorder->pWaveInHeaderList[nIndex].lpData = (LPSTR)new BYTE[pRecorder->pWaveInHeaderList[nIndex].dwBufferLength];
                if(NULL == pRecorder->pWaveInHeaderList[nIndex].lpData)
                {
                        FreeWaveInBuffer();
                        return FALSE;
                }
        }

        return TRUE;
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:FreeWaveInBuffer
// 功能描述:销毁录音途中用到的全部WAVE IN缓冲
//
////////////////////////////////////////////////////////////////////////////////
void CWaveRecorder::FreeWaveInBuffer()
{
        int nIndex;
        RECORDER_HANDLER *pRecorder;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        if(NULL != pRecorder->pWaveInHeaderList)
        {
                //
                // 销毁WAVE IN缓冲链中各成员
                //
                for(nIndex = 0; nIndex < pRecorder->wWaveInBuffersCount; nIndex++)
                {
                        if(NULL != pRecorder->pWaveInHeaderList[nIndex].lpData)
                        {
                                delete pRecorder->pWaveInHeaderList[nIndex].lpData;
                        }
                }

                //
                // 销毁WAVE IN缓冲链
                //
                delete pRecorder->pWaveInHeaderList;
                pRecorder->pWaveInHeaderList = NULL;
        }
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:AddWaveInBuffer
// 功能描述:向录音WAVE IN缓冲队列中添加成员
//
////////////////////////////////////////////////////////////////////////////////
BOOL CWaveRecorder::AddWaveInBuffer(int nBufferIndex)
{
        MMRESULT hResult;
        LPWAVEHDR pWaveHdr;
        LPSTR pWaveInData;
        int nDataLength;
        RECORDER_HANDLER *pRecorder;

        pRecorder = (RECORDER_HANDLER *)m_hRecorder;
        ASSERT(NULL != pRecorder);

        if((0 > nBufferIndex)
        || (nBufferIndex > pRecorder->wWaveInBuffersCount)
        )
        {
                return FALSE;
        }

        if(NULL == pRecorder->pWaveInHeaderList)
        {
                return FALSE;
        }

        //
        // 获取当前WAVE IN数据头
        //
        pWaveHdr = &pRecorder->pWaveInHeaderList[nBufferIndex];

        //
        // 初始化WAVE IN HEADER
        //
        pWaveInData = pWaveHdr->lpData;
        nDataLength = pWaveHdr->dwBufferLength;
        memset(pWaveHdr, 0, sizeof(WAVEHDR));
        pWaveHdr->lpData = pWaveInData;
        pWaveHdr->dwBufferLength = nDataLength;

        //
        // 预处理录音缓冲
        //
        hResult = ::waveInPrepareHeader(pRecorder->hWaveIn, pWaveHdr, sizeof(WAVEHDR));
        if(MMSYSERR_NOERROR != hResult)
        {
                return FALSE;
        }

        //
        // 添加录音缓冲到缓冲对列
        //
        hResult = ::waveInAddBuffer(pRecorder->hWaveIn, pWaveHdr, sizeof(WAVEHDR));
        if(MMSYSERR_NOERROR != hResult)
        {
                return FALSE;
        }
       
        //
        // 递加WAVE IN缓冲引用计数
        //
        pRecorder->wWaveInBufferUsedCount++;

        return TRUE;
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:OnRecordCallback
// 功能描述:录音中途事件通知回调函数
//
////////////////////////////////////////////////////////////////////////////////
void CALLBACK CWaveRecorder::OnRecordCallback(HDRVR hdrvr, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
        CWaveRecorder *pThis;

        pThis = (CWaveRecorder *)dwUser;
        if(NULL == pThis)
        {
                return;
        }

        switch(uMsg)
        {
        case MM_WIM_DATA:        //WAVE录音阶段数据提交通知
                OnMM_WIM_DATA(pThis, (LPWAVEHDR)dw1);
                break;

        case MM_WIM_CLOSE:        //录音结束通知
                OnMM_WIM_CLOSE(pThis);
                break;

        case MM_WIM_OPEN:        //打开录音设备通知
                ;//
                break;

        default:
                ;//
                break;
        }
}

////////////////////////////////////////////////////////////////////////////////
// 函数名称:PostStopThread
// 功能描述:通知停止录音线程
//
////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI CWaveRecorder::PostStopThread(IN LPVOID lpParam)
{
        CWaveRecorder *pThis;

        pThis = (CWaveRecorder *)lpParam;
        if(NULL == pThis)
        {
                return 0;
        }

        pThis->Stop();

        ASSERT(NULL != pThis->m_hPostStopThread);
        CloseHandle(pThis->m_hPostStopThread);
        pThis->m_hPostStopThread = NULL;

        return 1;
}
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

14
 
代码中"prie:"是什么意思?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
WaveEndCallback_T   ??
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 
搞定,结贴
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表