// MixIn.cpp: implementation of the CMixIn class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MixIn.h"
#define WND_CLASS_NAME "Input Volume Msg Wnd Class"
#define WND_NAME "Input Volume Msg Wnd"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
static CMixIn *g_pThis = NULL;
LRESULT CALLBACK CMixIn::MixerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if ( uMsg == MM_MIXM_CONTROL_CHANGE )
{
if ( g_pThis )
{
g_pThis->OnControlChanged( (DWORD)lParam );
}
}
return ::DefWindowProc( hwnd, uMsg, wParam, lParam);
}
CMixIn::CMixIn() :
m_iDevNum(0),
m_uiMixerId(0),
m_hMixer(0),
m_hWnd(NULL),
m_bIni(FALSE),
m_dwMinimalVolume(0),
m_dwMaximalVolume(100)
{
g_pThis = this;
}
CMixIn::~CMixIn()
{
}
MMRESULT CMixIn::GetLastMMError()
{
return m_mmr;
}
CString CMixIn::GetLastErrorString()
{
char buffer[256];
memset(buffer,0,256);
switch(m_mmr)
{
case MMSYSERR_NOERROR:
sprintf(buffer,"No error.");
break;
case MIXERR_INVALCONTROL:
sprintf(buffer,"Specified device handle is invalid.");
break;
case MMSYSERR_BADDEVICEID:
sprintf(buffer,"The hmxobj parameter specifies an invalid device identifier.");
break;
case MMSYSERR_INVALFLAG:
sprintf(buffer,"One or more flags are invalid.");
break;
case MMSYSERR_INVALHANDLE:
sprintf(buffer,"The hmxobj parameter specifies an invalid handle.");
break;
case MMSYSERR_INVALPARAM:
sprintf(buffer,"One or more parameters are invalid.");
break;
case MMSYSERR_NODRIVER:
sprintf(buffer,"No mixer device is available for the object specified by hmxobj.");
break;
case MIXERR_INVALLINE:
sprintf(buffer,"The audio line reference is invalid..");
break;
case MMSYSERR_NOTSUPPORTED:
sprintf(buffer,"The mixer device did not process the message.");
break;
case MMSYSERR_ALLOCATED:
sprintf(buffer,"The specified resource is already allocated by the maximum number of clients possible.");
break;
case MMSYSERR_NOMEM:
sprintf(buffer,"Unable to allocate resources.");
break;
default:
sprintf(buffer,"Unknow error,Error code %d",m_mmr);
break;
}
return buffer;
}
BOOL CMixIn::OpenMixer()
{
m_iDevNum = mixerGetNumDevs();
if (m_iDevNum == 0)
{
TRACE("There (is) are no device mixer.\n");
return FALSE;
}
WAVEFORMATEX wfx;
memset( &wfx, 0, sizeof(WAVEFORMATEX) );
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1;
wfx.nSamplesPerSec = 8000;
wfx.nAvgBytesPerSec = 1 * 8000 * 16 / 8;
wfx.nBlockAlign = 16 * 1 / 8;
wfx.wBitsPerSample = 16;
wfx.cbSize = 0;
HWAVEIN hwaveIn;
m_mmr = waveInOpen( &hwaveIn, WAVE_MAPPER, &wfx, 0L, 0L, CALLBACK_NULL );
if ( m_mmr != MMSYSERR_NOERROR )
{
return false;
}
m_mmr = mixerGetID((HMIXEROBJ)hwaveIn, &m_uiMixerId, MIXER_OBJECTF_HWAVEIN );
waveInClose( hwaveIn );
if ( m_mmr != MMSYSERR_NOERROR )
{
return false;
}
// Exposing Window to Mixer
WNDCLASSEX wcx;
memset( &wcx, 0, sizeof(WNDCLASSEX) );
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.lpszClassName = WND_CLASS_NAME;
wcx.lpfnWndProc = (WNDPROC)MixerWndProc;
::RegisterClassEx(&wcx);
m_hWnd = CreateWindow( WND_CLASS_NAME,
WND_NAME,
WS_POPUP | WS_DISABLED,
0, 0, 0, 0,
NULL, NULL, NULL, NULL );
if ( !m_hWnd )
{
return false;
}
::ShowWindow(m_hWnd, SW_HIDE);
m_mmr = mixerOpen(&m_hMixer, m_uiMixerId, (DWORD)m_hWnd, 0L, CALLBACK_WINDOW );
if (m_mmr != MMSYSERR_NOERROR )
{
return false;
}
return TRUE;
}
BOOL CMixIn::Initialize(UINT uLineIndex)
{
if (m_hMixer)
{
TRACE("You haven't open the mixer.\n");
return FALSE;
}
MIXERLINE MixerLine;
memset( &MixerLine, 0, sizeof(MIXERLINE) );
MixerLine.cbStruct = sizeof(MIXERLINE);
MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
MixerLine.dwSource = 1;
m_mmr = mixerGetLineInfo( (HMIXEROBJ)m_hMixer, &MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE );
if ( m_mmr != MMSYSERR_NOERROR )
{
return false;
}
MIXERCONTROL Control;
memset( &Control, 0, sizeof(MIXERCONTROL));
Control.cbStruct = sizeof(MIXERCONTROL);
MIXERLINECONTROLS LineControls;
memset( &LineControls, 0, sizeof(MIXERLINECONTROLS));
LineControls.cbStruct = sizeof(MIXERLINECONTROLS);
MIXERLINE Line;
memset( &Line, 0, sizeof(MIXERLINE) );
Line.cbStruct = sizeof(MIXERLINE);
if ((uLineIndex < MixerLine.cConnections))
{
Line.dwDestination = MixerLine.dwDestination;
Line.dwSource = uLineIndex;
m_mmr = mixerGetLineInfo((HMIXEROBJ)m_hMixer, &Line, MIXER_GETLINEINFOF_SOURCE );
if ( m_mmr != MMSYSERR_NOERROR )
{
return false;
}
LineControls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
LineControls.dwLineID = Line.dwLineID;
LineControls.cControls = 1;
LineControls.cbmxctrl = sizeof(MIXERCONTROL);
LineControls.pamxctrl = &Control;
m_mmr = mixerGetLineControls( (HMIXEROBJ)m_hMixer, &LineControls, MIXER_GETLINECONTROLSF_ONEBYTYPE );
if ( m_mmr == MMSYSERR_NOERROR )
{
if ((Control.fdwControl & MIXERCONTROL_CONTROLF_DISABLED) )
{
return FALSE;
}
}
else
{
return FALSE;
}
}
else
{
return false;
}
m_dwMinimalVolume = Control.Bounds.dwMinimum;
m_dwMaximalVolume = Control.Bounds.dwMaximum;
return TRUE;
}
BOOL CMixIn::EnumerateInputLines(int &dwUserValue)
{
if (!m_hMixer)
{
TRACE("Handle of mix hasn't been get.\n");
return FALSE;
}
MIXERLINE MixerLine;
memset( &MixerLine, 0, sizeof(MIXERLINE) );
MixerLine.cbStruct = sizeof(MIXERLINE);
MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT ;
m_mmr = mixerGetLineInfo( (HMIXEROBJ)m_hMixer, &MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE );
if (m_mmr != MMSYSERR_NOERROR )
{
return false;
}
MIXERLINE Line;
for (UINT uLineIndex = 0; uLineIndex < MixerLine.cConnections; uLineIndex++ )
{
memset( &Line, 0, sizeof(MIXERLINE));
Line.cbStruct = sizeof(MIXERLINE);
Line.dwDestination = MixerLine.dwDestination;
Line.dwSource = uLineIndex;
m_mmr = mixerGetLineInfo((HMIXEROBJ)m_hMixer, &Line, MIXER_GETLINEINFOF_SOURCE );
if (m_mmr != MMSYSERR_NOERROR )
{
return false;
}
if ( Line.dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE )
{
dwUserValue = uLineIndex;
break;
}
}
return true;
}
BOOL CMixIn::CloseMixer()
{
if (m_hMixer)
{
m_mmr = mixerClose((HMIXER)m_hMixer);
if (m_mmr != MMSYSERR_NOERROR )
{
return false;
}
}
return TRUE;
}
BOOL CMixIn::Ini()
{
if (m_bIni)
{
TRACE("Mix in has alreadly ini.\n");
return FALSE;
}
if (!OpenMixer())
{
TRACE("%s.\n",GetLastErrorString());
return FALSE;
};
int i=-1;
EnumerateInputLines(i);
if(i != -1)
{
if (!Initialize(i))
{
TRACE("%s.\n",GetLastErrorString());
};
}
m_bIni = TRUE;
return TRUE;
}
BOOL CMixIn::UnIni()
{
if (!m_bIni)
{
TRACE("Mix in hasn't ini.\n");
return FALSE;
}
::DestroyWindow( m_hWnd );
CloseMixer();
m_iDevNum = 0;
m_uiMixerId = 0;
m_hMixer = 0;
m_hWnd = NULL;
m_bIni = FALSE;
m_dwMinimalVolume = 0;
m_dwMaximalVolume = 100;
return TRUE;
}
void CMixIn::OnControlChanged(int iValue)
{
}
DWORD CMixIn::GetMinimalVolume()
{
if (!m_bIni)
{
TRACE("Mix in hasn't ini.\n");
return 0;
}
return this->m_dwMinimalVolume ;
}
DWORD CMixIn::GetMaximalVolume()
{
if (!m_bIni)
{
TRACE("Mix in hasn't ini.\n");
return 100;
}
return this->m_dwMaximalVolume ;
}
DWORD CMixIn::GetCurrentVolume()
{
if (!m_bIni)
{
TRACE("Mix in hasn't ini.\n");
return 0;
}
return 0;
}
void CMixIn::SetCurrentVolume(DWORD dwValue)
{
}
没有合适的资源?快使用搜索试试~ 我知道了~
商业编程-源码-采用G.729的语言实时通信DLL.zip
共54个文件
h:20个
cpp:18个
rc:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 85 浏览量
2022-06-22
19:13:00
上传
评论
收藏 140KB ZIP 举报
温馨提示
商业编程-源码-采用G.729的语言实时通信DLL.zip
资源详情
资源评论
资源推荐
收起资源包目录
商业编程-源码-采用G.729的语言实时通信DLL.zip (54个子文件)
采用G.729的语言实时通信DLL
Talk
test
test.h 1KB
StdAfx.cpp 206B
test.cpp 2KB
test.clw 1KB
test.rc 5KB
Debug
test.exe 104KB
TalkDll.dll 172KB
testDlg.cpp 4KB
StdAfx.h 1KB
testDlg.h 1KB
Resource.h 774B
Release
test.dsp 4KB
res
test.rc2 396B
test.ico 1KB
test.dsw 531B
TalkDll
MyWaveIn.cpp 1017B
StdAfx.cpp 209B
SortData.h 2KB
ListenSocket.h 1KB
MyWaveIn.h 793B
G729a.lib 94KB
SendClient.h 1KB
head.h 442B
Interface.cpp 4KB
RecSocket.cpp 2KB
TalkDll.dsp 6KB
TalkDll.def 187B
UdpSocket.h 1KB
ClientSocket.cpp 3KB
WaveOut.cpp 6KB
TalkDll.cpp 2KB
WaveIn.cpp 7KB
TalkDll.clw 766B
TalkDll.rc 4KB
WaveIn.h 2KB
ClientSocket.h 1KB
Debug
UdpSocket.cpp 1KB
AudioCode.h 885B
SortData.cpp 3KB
MixOut.h 1KB
StdAfx.h 1KB
ListenSocket.cpp 2KB
RecSocket.h 1KB
WaveOut.h 2KB
Interface.h 2KB
TalkDll.dsw 726B
Resource.h 418B
MixIn.cpp 8KB
SendClient.cpp 2KB
MixOut.cpp 6KB
res
TalkDll.rc2 399B
MixIn.h 2KB
AudioCode.cpp 2KB
文档
Talk dll 结构.doc 32KB
共 54 条
- 1
programxh
- 粉丝: 17
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0