window 采集扬声器音频并播放


通过Core Audio中的API函数来实现采集声卡输出,采集到的音频流保存与内存,并直接播放.支持 window Vista 以上系统.
资源截图
代码片段和文件信息
#include “stdafx.h“
#include “AudioManager.h“

#ifndef _min
#define _min(ab)            (((a) < (b)) ? (a) : (b))
#endif //_min

CAudioManager::CAudioManager(IPlaybackEvent* pEvent)
:m_pPlaybackEventHandler(pEvent)
{
m_pFormat = NULL;
m_nOffset = 0;
}

CAudioManager::~CAudioManager()
{
ClearData();
}

BOOL CAudioManager::StartCapture()
{
BOOL bRet = m_capture.IsCapturing();
if(!bRet)
{
if(m_capture.Initialize(this))
{
bRet = m_capture.Start();
}
}

return bRet;
}

VOID CAudioManager::StopCapture()
{
if(m_capture.IsCapturing())
{
m_capture.Stop();
m_capture.Destroy();
}
}

BOOL CAudioManager::IsCapturing() const
{
return m_capture.IsCapturing();
}

BOOL CAudioManager::StartPlayback()
{
BOOL bRet = m_render.IsRendering();

if(!bRet)
{
if(m_render.Initialize(this))
{
bRet = m_render.Start();
}
}

return bRet;
}

VOID CAudioManager::StopPlayback()
{
if(m_render.IsRendering())
{
m_render.Stop();
m_render.Destroy();
}
}

BOOL CAudioManager::IsPlaybacking() const
{
return m_render.IsRendering();
}

BOOL CAudioManager::CanPlay() const
{
return !m_dataList.empty();
}

VOID CAudioManager::ClearData()
{
LPBYTE p = (LPBYTE)m_pFormat;
delete []p;
m_pFormat = NULL;

std::list::iterator itr = m_dataList.begin();
while(itr != m_dataList.end())
{
Audio_Data& item = *itr;
delete []item.pData;
++itr;
}
m_dataList.clear();
}

VOID CAudioManager::OnCatpureStart(DWORD dwInterval)
{

}

VOID CAudioManager::OnCaptureStop()
{

}

VOID CAudioManager::OnAdjustCaptureFormat(WAVEFORMATEX* pFormat)
{
ClearData();

INT nDataLen = sizeof(WAVEFORMATEX) + pFormat->cbSize;
LPBYTE pData = new BYTE[nDataLen];
if(pData != NULL)
{
memcpy_s(pData nDataLen pFormat nDataLen);
m_pFormat = (WAVEFORMATEX*)pData;
}
}

VOID CAudioManager::OnCatpureData(LPBYTE pData INT nDataLen)
{
Audio_Data item;
item.nDataLen = nDataLen;
item.pData = new BYTE[nDataLen];
if(item.pData != NULL)
{
memcpy_s(item.pData nDataLen pData nDataLen);
m_dataList.push_back(item);
}
}


VOID CAudioManager::OnRenderStart()
{
m_nOffset = 0;
m_itrCurrent = m_dataList.begin();
}

VOID CAudioManager::OnRenderStop()
{

}

VOID CAudioManager::OnAdjustRenderFormat(WAVEFORMATEX* pFormat)
{
if(pFormat == NULL) return;

INT nDataLen1 = sizeof(WAVEFORMATEX) + pFormat->cbSize;
INT nDataLen2 = sizeof(WAVEFORMATEX) + m_pFormat->cbSize;
if(nDataLen1 == nDataLen2)
{
memcpy_s(pFormatnDataLen1  m_pFormat nDataLen2);
}
else
{
memcpy_s(pFormatnDataLen1  m_pFormat sizeof(WAVEFORMATEX));
}
}

VOID CAudioManager::OnGetRenderData(LPBYTE pData INT nDataLen)
{
INT nCopyed = 0;
INT nNeedCopy = nDataLen;
BOOL bEnd(FALSE);

if(m_itrCurrent == m_dataList.end()) 
{
m_itrCurrent = m_dataList.begin();
m_nOffset = 0;
}

while(nCopyed < nDataLen )
{

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    ..A..H.     95232  2017-12-05 18:57  .vsAudioRecordv15.suo

     文件   39071744  2017-12-05 18:57  .vsAudioRecordv15Browse.VC.db

     文件   23920640  2017-12-05 15:11  .vsAudioRecordv15ipch58a55fade2db6b66.ipch

     文件     327680  2017-12-04 14:40  .vsAudioRecordv15ipchAutoPCH247167ad114ce9c7AUDIOCLIENT.ipch

     文件   23920640  2017-12-05 14:08  .vsAudioRecordv15ipchfbb1ebda711883a6.ipch

     文件       3620  2017-12-04 11:17  AudioRecordAudioManager.cpp

     文件       1391  2017-12-04 14:19  AudioRecordAudioManager.h

     文件       9732  2017-12-04 11:19  AudioRecordAudioRecord.aps

     文件       7185  2014-08-29 09:36  AudioRecordAudioRecord.cpp

     文件         39  2014-08-25 16:14  AudioRecordAudioRecord.h

     文件       2998  2012-06-05 22:11  AudioRecordAudioRecord.ico

     文件       6598  2014-08-25 16:14  AudioRecordAudioRecord.rc

     文件       5415  2017-12-04 10:59  AudioRecordAudioRecord.vcxproj

     文件       2714  2014-08-29 09:56  AudioRecordAudioRecord.vcxproj.filters

     文件      10339  2014-08-29 10:24  AudioRecordAudioRender.cpp

     文件        793  2014-08-27 17:26  AudioRecordAudioRender.h

     文件       1102  2017-12-05 14:07  AudioRecordClassRegister.h

     文件     159681  2017-12-05 15:10  AudioRecordDebugAudioManager.obj

     文件        252  2017-12-05 15:10  AudioRecordDebugAudioRecord.log

     文件      62833  2017-12-05 15:10  AudioRecordDebugAudioRecord.obj

     文件    8454144  2017-12-05 15:10  AudioRecordDebugAudioRecord.pch

     文件       6816  2017-12-05 15:10  AudioRecordDebugAudioRecord.res

     文件        230  2017-12-05 15:10  AudioRecordDebugAudioRecord.tlogAudioRecord.lastbuildstate

     文件       5406  2017-12-05 15:10  AudioRecordDebugAudioRecord.tlogCL.command.1.tlog

     文件      87634  2017-12-05 15:10  AudioRecordDebugAudioRecord.tlogCL.read.1.tlog

     文件       4680  2017-12-05 15:10  AudioRecordDebugAudioRecord.tlogCL.write.1.tlog

     文件       2724  2017-12-05 15:10  AudioRecordDebugAudioRecord.tloglink.command.1.tlog

     文件       6174  2017-12-05 15:10  AudioRecordDebugAudioRecord.tloglink.read.1.tlog

     文件       1734  2017-12-05 15:10  AudioRecordDebugAudioRecord.tloglink.write.1.tlog

     文件        478  2017-12-05 15:10  AudioRecordDebugAudioRecord.tlog
c.command.1.tlog

............此处省略65个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)