如何让单个程序静音,而不影响系统声音

only_youch 2010-09-02 03:23:50
我在程序中遇到一个问题,我的程序是能够播放声音的,我需要让我的程序能够静音,而不影响系统声音,就像音乐播放器一样,能够单调调节本程序的音量而不影响系统音量。另外傲游浏览器里面也有这么个功能,但不知道是如何实现的?

大家能给点意见?
...全文
3369 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-10-16
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
WL_river 2010-09-17
  • 打赏
  • 举报
回复
最大的问题是xp及以下OS中,程序跟系统用的是一套API,对程序进行的声音调节会影响到系统。
vista及以上的OS中,程序跟系统分别有不同的声音控制API,所以可以单独调节。

个人感觉,类似于The world、搜狗等浏览器中对网页的声音调节,可能用的是DX来实现。
现在还是人类 2010-09-08
  • 打赏
  • 举报
回复
在MCI中,用
setaudio (MCI设备名) volume to (音量大小0-1000)
如:
mciSendString("setaudio MyMCIPlay volume to 500",RetString,128,NULL);
解释:
MCI设备名 是根据你打开MCI设备时所定义的名称
如:

char mcistr[255];
char RetString[128];
//MyMCIPlay 就是自己定义的MCI设备名
sprintf(mcistr,"open %s TYPE MPEGVideo ALIAS MyMCIPlay STYLE child PARENT %d",filename,hWnd);
rd=mciSendString(mcistr, RetString, 128, hwnd);
dengzikun 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 only_youch 的回复:]
我程序中加载的是网页,我是想在程序上加个按钮来开启静音功能,至于网页中的声音如何播放,这个不是我需要去了解的。也不是正途。


引用 20 楼 l_xiangxi 的回复:
引用 14 楼 only_youch 的回复:
你的好像是调节系统的音量,我是要单独调节一个程序的,和系统无关。


引用 12 楼 psbeond 的回复:
以上两种方法, 一种是xp的,一种是vista的……
[/Quote]

两个途径

1. 网页中播放声音的控件提供了独立静音的功能,你去调用.
2. 如果没有提供,只有自己去写播放控件去实现了.
only_youch 2010-09-08
  • 打赏
  • 举报
回复
我程序中加载的是网页,我是想在程序上加个按钮来开启静音功能,至于网页中的声音如何播放,这个不是我需要去了解的。也不是正途。

[Quote=引用 20 楼 l_xiangxi 的回复:]
引用 14 楼 only_youch 的回复:
你的好像是调节系统的音量,我是要单独调节一个程序的,和系统无关。


引用 12 楼 psbeond 的回复:
以上两种方法, 一种是xp的,一种是vista的。我几年前总结的。你可以参考一下。


我觉得问题是楼主的程序是如何播放声音的,
把代码贴出来
才能对症下药
[/Quote]
only_youch 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jackson35296 的回复:]
引用 15 楼 only_youch 的回复:
查了一下这些接口的介绍,好像是可以解决Vista以上版本的这个问题,但XP上有办法如何解决没?


引用 9 楼 jackson35296 的回复:
vista和win7下是可以单独控制每个进程的音量的。可以参考MSDN上的WASAPI,有一些接口
IAudioClient
IAudioSessionControl
ISimpleAu……
[/Quote]

要处理声源,这不太可能吧。我程序中加载的网页要播放什么声音,我就是知道了,也不好去“处理”吧。
jackson35296 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 only_youch 的回复:]
查了一下这些接口的介绍,好像是可以解决Vista以上版本的这个问题,但XP上有办法如何解决没?


引用 9 楼 jackson35296 的回复:
vista和win7下是可以单独控制每个进程的音量的。可以参考MSDN上的WASAPI,有一些接口
IAudioClient
IAudioSessionControl
ISimpleAudioVolume
IAudioStreamVo……
[/Quote]

xp下只能是对声源进行处理了,改变初始波形的振幅,直接控制音量应该是不行的。
l_xiangxi 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 only_youch 的回复:]
你的好像是调节系统的音量,我是要单独调节一个程序的,和系统无关。


引用 12 楼 psbeond 的回复:
以上两种方法, 一种是xp的,一种是vista的。我几年前总结的。你可以参考一下。
[/Quote]

我觉得问题是楼主的程序是如何播放声音的,
把代码贴出来
才能对症下药
现在还是人类 2010-09-07
  • 打赏
  • 举报
回复
用MCI接口做,可以单独控制MCI设备的音量
cdsnpeter 2010-09-07
  • 打赏
  • 举报
回复
使用DSound把,DSound的IDirectSoundBuffer有个方法SetVolume就可以来设置音量。

具体可以参考DSound的文档。
only_youch 2010-09-06
  • 打赏
  • 举报
回复
查了一下这些接口的介绍,好像是可以解决Vista以上版本的这个问题,但XP上有办法如何解决没?

[Quote=引用 9 楼 jackson35296 的回复:]
vista和win7下是可以单独控制每个进程的音量的。可以参考MSDN上的WASAPI,有一些接口
IAudioClient
IAudioSessionControl
ISimpleAudioVolume
IAudioStreamVolume
IChannelAudioVolume
IAudioEndpointVolume
[/Quote]
only_youch 2010-09-06
  • 打赏
  • 举报
回复
你的好像是调节系统的音量,我是要单独调节一个程序的,和系统无关。

[Quote=引用 12 楼 psbeond 的回复:]
以上两种方法, 一种是xp的,一种是vista的。我几年前总结的。你可以参考一下。
[/Quote]
only_youch 2010-09-06
  • 打赏
  • 举报
回复
感谢大家,我去研究一下。
psbeond 2010-09-06
  • 打赏
  • 举报
回复
以上两种方法, 一种是xp的,一种是vista的。我几年前总结的。你可以参考一下。
psbeond 2010-09-06
  • 打赏
  • 举报
回复
调整系统音量和静音For Vista
1.为了编译Endpointvolume.h文件,必须在stdafx.h中定义NTDDI_VERSION,使其值大于或等于NTDDI_WINXPSP1,例如定义成下面的形式:

#define NTDDI_VERSION (NTDDI_WINXPSP1+1)


2. 生成VistaVolume.h和VistaVolume.cpp文件

// VistaVolume.h
#ifndef _VISTAVOLUME_H_
#define _VISTAVOLUME_H_


#include <Mmdeviceapi.h> // for IMMDeviceEnumerator and IMMDevice
#include <Endpointvolume.h> // for IAudioEndpointVolume, must #define NTDDI_VERSION NTDDI_WINXPSP1 in stdafx.h


typedef void (*NotifyCallback)(AUDIO_VOLUME_NOTIFICATION_DATA *);


class CAudioEndpointVolumeCallback;

class CVistaVolume
{
public:
CVistaVolume();
~CVistaVolume();

public:
HRESULT Init();
HRESULT Uninit();
HRESULT SetVolume(float fVolume);
HRESULT GetVolume(float *pfVolume);
HRESULT SetMute(BOOL bMute);
HRESULT GetMute(BOOL *pbMute);
HRESULT SetNotifyCallback(NotifyCallback pfn);

private:
IMMDeviceEnumerator *m_pEnumerator;
IMMDevice *m_pDevice;
IAudioEndpointVolume *m_pAEV;

CAudioEndpointVolumeCallback *m_pCallback;
BOOL m_bInit;
};

#endif //_VISTAVOLUME_H_




// VistaVolume.cpp
#include "stdafx.h"
#include "VistaVolume.h"

template <class T>
inline void SafeRelease(T &p)
{
if (p != NULL)
{
p->Release();
p = NULL;
}
}


class CAudioEndpointVolumeCallback : public IAudioEndpointVolumeCallback
{
public:
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject)
{
return S_OK;
}

virtual ULONG STDMETHODCALLTYPE AddRef(void)
{
m_cRef++;
return m_cRef;
}

virtual ULONG STDMETHODCALLTYPE Release(void)
{
m_cRef--;
if (m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}

virtual HRESULT STDMETHODCALLTYPE OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify)
{
if (m_pfn != NULL)
{
m_pfn(pNotify);
}
return S_OK;
}

public:
CAudioEndpointVolumeCallback()
{
m_cRef = 0;
m_pfn = NULL;
}
virtual ~CAudioEndpointVolumeCallback()
{
m_pfn = NULL;
}

void SetNotifyCallback(NotifyCallback pfn)
{
m_pfn = pfn;
}

private:
LONG m_cRef;
NotifyCallback m_pfn;
};


CVistaVolume::CVistaVolume()
{
m_pEnumerator = NULL;
m_pDevice = NULL;
m_pAEV = NULL;

m_pCallback = NULL;
m_bInit = FALSE;

Init();
}

CVistaVolume::~CVistaVolume()
{
Uninit();
}

HRESULT CVistaVolume::Init()
{
if (m_bInit)
return S_OK;

HRESULT hr = E_FAIL;

hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,
CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&m_pEnumerator);
if (FAILED(hr))
return hr;

hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice);
if (FAILED(hr))
return hr;

hr = m_pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&m_pAEV);
if (FAILED(hr))
return hr;

m_bInit = TRUE;

return hr;
}

HRESULT CVistaVolume::Uninit()
{
if (!m_bInit)
return S_OK;

if (m_pCallback!=NULL && m_pAEV!=NULL)
{
m_pCallback->SetNotifyCallback(NULL);
m_pAEV->UnregisterControlChangeNotify(m_pCallback);
m_pCallback = NULL;
}

SafeRelease(m_pAEV);
SafeRelease(m_pDevice);
SafeRelease(m_pEnumerator);

m_bInit = FALSE;

return S_OK;
}

HRESULT CVistaVolume::SetVolume(float fVolume)
{
HRESULT hr = E_FAIL;

hr = m_pAEV->SetMasterVolumeLevelScalar(fVolume, NULL);

return hr;
}

HRESULT CVistaVolume::GetVolume(float *pfVolume)
{
HRESULT hr = E_FAIL;

hr = m_pAEV->GetMasterVolumeLevelScalar(pfVolume);

return hr;
}

HRESULT CVistaVolume::SetMute(BOOL bMute)
{
HRESULT hr = E_FAIL;

hr = m_pAEV->SetMute(bMute, NULL);

return hr;
}

HRESULT CVistaVolume::GetMute(BOOL *pbMute)
{
HRESULT hr = E_FAIL;

hr = m_pAEV->GetMute(pbMute);

return hr;
}

// 为了响应系统音量或静音状态的改变, 可以使用CVistaVolume::SetNotifyCallback设置一个回调函数, 当有改变时,自动调用用户指定的这个函数.
HRESULT CVistaVolume::SetNotifyCallback(NotifyCallback pfn)
{
if (m_pCallback == NULL)
{
HRESULT hr = E_FAIL;
m_pCallback = new CAudioEndpointVolumeCallback;

int n = 0;
n = 5;

hr = m_pAEV->RegisterControlChangeNotify(m_pCallback);
if (FAILED(hr))
return hr;

m_pCallback->SetNotifyCallback(pfn);
}

return S_OK;
}


使用:定义一个CVistaVolume的类成员m_volume;

// 当音量大小或静音状态改变时, 调用这个函数
void NotifyFun(PAUDIO_VOLUME_NOTIFICATION_DATA pNotify)
{
// 在这里加入处理代码
}

m_volume.SetMute(TRUE);
m_volume.SetNotifyCallback(NotifyFun);
psbeond 2010-09-06
  • 打赏
  • 举报
回复
调整系统音量和静音 For 2K,XP.txt
注: 也适用于Vista系统下调整主音量

HWND g_hWnd = NULL; // 指定接收设备改变通知消息MM_MIXM_CONTROL_CHANGE的窗口, 一般在窗口创建的时候初始化g_hWnd. 必须在调用OpenMixer之间初始化g_hWnd
HMIXER g_hMixer = NULL;

UINT OpenMixer()
{
// mixerGetID
UINT mixID;
MMRESULT mmRet = ::mixerGetID(0, &mixID, MIXER_OBJECTF_HMIXER);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerOpen
mmRet = ::mixerOpen(&g_hMixer, mixID, (DWORD)g_hWnd, NULL, MIXER_OBJECTF_HMIXER|CALLBACK_WINDOW);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

return MMSYSERR_NOERROR;
}

UINT CloseMixer()
{
// MixerClose
MMRESULT mmRet;

mmRet = ::mixerClose(g_hMixer);

return mmRet;
}

//
UINT SetVolume(int nValue) // 0-65535
{
MMRESULT mmRet;
// MixerGetLineInfo
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwDestination = 0;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_DESTINATION);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineInfo
DWORD lr;
lr = mxl.dwLineID;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwLineID = lr;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_LINEID);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineControls
MIXERCONTROL *pmxctrl;
pmxctrl = new MIXERCONTROL [mxl.cControls];
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.cControls = mxl.cControls;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = pmxctrl;
mxlc.dwLineID = lr;
mmRet = ::mixerGetLineControls(0, &mxlc, MIXER_GETLINECONTROLSF_ALL);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerGetControlDetails
UINT i = 0;
for (i=0; i<mxlc.cControls; i++)
{
if (pmxctrl[i].dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
break;
}
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED volume;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = pmxctrl[i].dwControlID;
mxcd.cChannels = 1;
mxcd.hwndOwner = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &volume;
delete [] pmxctrl;
pmxctrl = NULL;
mmRet = ::mixerGetControlDetails(0, &mxcd, MIXER_OBJECTF_WAVEOUT);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerSetControlDetails
volume.dwValue = nValue;
mmRet = ::mixerSetControlDetails(0, &mxcd, MIXER_OBJECTF_MIXER);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

return MMSYSERR_NOERROR;
}

//
UINT GetVolume(int *pnValue) // 0-65535
{
ASSERT(pnValue != NULL);
MMRESULT mmRet;

// MixerGetLineInfo
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwDestination = 0;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_DESTINATION);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineInfo
DWORD lr;
lr = mxl.dwLineID;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwLineID = lr;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_LINEID);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineControls
MIXERCONTROL *pmxctrl;
pmxctrl = new MIXERCONTROL [mxl.cControls];
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.cControls = mxl.cControls;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = pmxctrl;
mxlc.dwLineID = lr;
mmRet = ::mixerGetLineControls(0, &mxlc, MIXER_GETLINECONTROLSF_ALL);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerGetControlDetails
UINT i = 0;
for (i=0; i<mxlc.cControls; i++)
{
if (pmxctrl[i].dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME)
break;
}
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED volume;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = pmxctrl[i].dwControlID;
mxcd.cChannels = 1;
mxcd.hwndOwner = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &volume;
delete [] pmxctrl;
pmxctrl = NULL;
mmRet = ::mixerGetControlDetails(0, &mxcd, MIXER_OBJECTF_WAVEOUT);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

*pnValue = volume.dwValue;

return MMSYSERR_NOERROR;
}

//
UINT SetMuteState(BOOL bMute)
{
MMRESULT mmRet;

// MixerGetLineInfo
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwDestination = 0;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_DESTINATION);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineInfo
DWORD lr;
lr = mxl.dwLineID;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwLineID = lr;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_LINEID);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineControls
MIXERCONTROL *pmxctrl;
pmxctrl = new MIXERCONTROL [mxl.cControls];
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.cControls = mxl.cControls;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = pmxctrl;
mxlc.dwLineID = lr;
mmRet = ::mixerGetLineControls(0, &mxlc, MIXER_GETLINECONTROLSF_ALL);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerGetControlDetails
UINT i = 0;
for (i=0; i<mxlc.cControls; i++)
{
if (pmxctrl[i].dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
break;
}
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_BOOLEAN mute;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = pmxctrl[i].dwControlID;
mxcd.cChannels = 1;
mxcd.hwndOwner = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mute;
delete [] pmxctrl;
pmxctrl = NULL;
mmRet = ::mixerGetControlDetails(0, &mxcd, MIXER_OBJECTF_WAVEOUT);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerSetControlDetails
mute.fValue = bMute;
mmRet = ::mixerSetControlDetails(0, &mxcd, MIXER_OBJECTF_MIXER);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

return MMSYSERR_NOERROR;
}

UINT GetMuteState(BOOL *pbMute)
{
ASSERT(pbMute != NULL);
MMRESULT mmRet;

// MixerGetLineInfo
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwDestination = 0;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_DESTINATION);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineInfo
DWORD lr;
lr = mxl.dwLineID;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwLineID = lr;
mmRet = ::mixerGetLineInfo(0, &mxl, MIXER_GETLINEINFOF_LINEID);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// --- MixerGetLineControls
MIXERCONTROL *pmxctrl;
pmxctrl = new MIXERCONTROL [mxl.cControls];
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.cControls = mxl.cControls;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = pmxctrl;
mxlc.dwLineID = lr;
mmRet = ::mixerGetLineControls(0, &mxlc, MIXER_GETLINECONTROLSF_ALL);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

// MixerGetControlDetails
UINT i = 0;
for (i=0; i<mxlc.cControls; i++)
{
if (pmxctrl[i].dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE)
break;
}
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_BOOLEAN mute;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = pmxctrl[i].dwControlID;
mxcd.cChannels = 1;
mxcd.hwndOwner = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mute;
delete [] pmxctrl;
pmxctrl = NULL;
mmRet = ::mixerGetControlDetails(0, &mxcd, MIXER_OBJECTF_WAVEOUT);
if (mmRet != MMSYSERR_NOERROR)
return mmRet;

*pbMute = mute.fValue;

return MMSYSERR_NOERROR;
}
jackson35296 2010-09-06
  • 打赏
  • 举报
回复
vista和win7下是可以单独控制每个进程的音量的。可以参考MSDN上的WASAPI,有一些接口
IAudioClient
IAudioSessionControl
ISimpleAudioVolume
IAudioStreamVolume
IChannelAudioVolume
IAudioEndpointVolume
only_youch 2010-09-06
  • 打赏
  • 举报
回复
有人了解这个问题的解决办法没?
oldforest 2010-09-03
  • 打赏
  • 举报
回复
播放WAV是没有这样的API,只有自己动手改变波的振幅
用DirectX是有这样的的API可以调用,如楼上所说的SetVolume
dengzikun 2010-09-03
  • 打赏
  • 举报
回复
那就用复杂的吧,DSOUND的SetVolume可以独立控制音量,也可控制系统音量.
或者自己往声卡填静音数据.
加载更多回复(4)
声音控制非常好, 应该内置 在每个应用程序的基础上控制音频,为单个应用程序调整音量和输出设备。将均衡器和其他音频效果应用于Mac上的任何音频。甚至可以随时随地调整Mac的音频设备设置和音量。有了SoundSource,就可以在菜单栏中进行所有操作。 快速访问系统设备 直接从菜单栏中快速访问Mac的Output,Input和Sound Effects音频设备的所有设置。 按应用的音频控制 每个应用程序控件可让您更改任何应用程序相对于其他应用程序的音量,并将单个应用程序发送到不同的音频输出。 任何应用程式上的音效 强大的“ Magic Boost”按钮,著名的10频段Lagutin均衡器和高级音频单元支持,可让任何音频听起来都很棒。 基本特征 每应用音量控制 一次调整每个应用程序的音量。使一个应用比其他应用更响亮或更柔和,甚至完全将其静音。 按应用输出重定向 精确控制音频的播放位置。将音乐从一个应用程序传递到最佳扬声器,同时通过Mac的内置输出听到其他声音。 每应用音效 使用内置的10频段均衡器和对音频单元的支持来增强单个应用程序声音系统音频设置 快速调整系统的输出,输入和音效设备的音量和输入电平,平衡甚至采样率。 全系统音效 通过内置的10频段均衡器并支持高级音频单元插件,应用效果来增强系统上所有音频的声音。 超级音量键 HDMI设备,DisplayPort监视器和许多其他音频输出无法支持Mac键盘上的音量键。SoundSource使这些键可以与您拥有的任何输出一起使用。 菜单栏访问 SoundSource位于您的菜单栏中,可快速轻松地访问所有必需的音频控件。 全局键盘访问 设置键盘快捷方式将SoundSource向前拉,使您无需单击菜单栏即可控制该应用程序。 浮动通道 经常调整?将SoundSource的主窗口固定在屏幕上,以便即时访问。 新!魔术升压和过载 两种不同的音频效果可帮助增强音频,即使是最小的扬声器,您也可以获得更饱满的声音。 新!暗模式支持 SoundSource现在包含一个深色主题,非常适合与MacOS的新深色模式配合使用。 新!菜单栏选项 交换SoundSource的默认菜单栏图标以显示音量指示器,以显示当前设置。您还可以添加一个电平表,以在播放音频时查看它。
TeamSpeak 3延续了TeamSpeak 2的优良功能,并在TS2的基础上有大幅的改进。程序用C 完全重写,提供了更好的稳定性和扩展性。跨平台100%兼容,同时可以运行在WINDOWS全系列(32位和64位系统)、Linux(32位和64位系统)、Mac OS X(苹果)操作系统上。新老用户都将享受到TeamSpeak3无与伦比的强大功能和全新的语音通讯体验。 TeamSpeak 3的新特性 (1)更清晰的语音质量和更好的延迟:TS3的语音质量有了一个质的飞跃。采用全新的speex和celt语音编码,分别适用于语音通话和音乐传输两种环境。并提供自动麦克风调整、先进的降噪和回声消除功能。语音的延迟也得到了明显的改善。 (2)可同时登录多个TS服务器:类似IE7、IE8的选项卡功能,TS3可以在同一个程序内打开多个选项卡,以方便同时登录多个TS服务器地址。 (3)强大的权限系统:TS3的权限系统完全不同于TS2,可以添加任意多的用户组,每个用户组的具体功能都可定制,基于频道、基于单个用户都可设置特别的权限。 (4)全新的用户认证系统:TS3引入了一个全新的认证系统,不同于用户名/密码的组合认证。登录TS3完全不需要用户名/密码。TS3会随时记忆您的独特身份,再也不需要为忘记用户名/密码苦恼了。 (5)好友管理:TS3拥有一个通讯录管理器,添加到通讯录的人,可以按朋友/中立/敌人来区分。可以设定是否对某人静音,是否拒收某人发来的文本消息,等等。 (6)3D音效:TS3现在具有完整的3D音效支持,通过设置,不同人的声音可以定位到不同的空间位置,自己可以处在一个立体三维空间的任意点上,听到前后左右不同方位传来的声音。如果您的音箱/耳机支持5.1或7.1声道,将获得更完美的效果。 (7)可设定头像:您还可以设定自己喜欢的头像显示在自己的TS上。 TeamSpeak 3截图
TeamSpeak 3 延续了TeamSpeak 2的优良功能,并在TS2的基础上有大幅的改进。程序用C 完全重写,提供了更好的稳定性和扩展性。跨平台100%兼容,同时可以运行在WINDOWS全系列(32位和64位系统)、Linux(32位和64位系统)Mac OS X(苹果)操作系统上。新老用户都将享受到TeamSpeak3无与伦比的强大功能和全新的语音通讯体验。 TeamSpeak 3的新特性包括: (1)更清晰的语音质量和更好的延迟:TS3的语音质量有了一个质的飞跃。采用全新的speex和celt语音编码,分别适用于语音通话和音乐传输两种环境。并提供自动麦克风调整、先进的降噪和回声消除功能。语音的延迟也得到了明显的改善。 (2)可同时登录多个TS服务器:类似IE7、IE8的选项卡功能,TS3可以在同一个程序内打开多个选项卡,以方便同时登录多个TS服务器地址。 (3)强大的权限系统:TS3的权限系统完全不同于TS2,可以添加任意多的用户组,每个用户组的具体功能都可定制,基于频道、基于单个用户都可设置特别的权限。 (4)全新的用户认证系统:TS3引入了一个全新的认证系统,不同于用户名/密码的组合认证。登录TS3完全不需要用户名/密码。TS3会随时记忆您的独特身份,再也不需要为忘记用户名/密码苦恼了。 (5)好友管理:TS3拥有一个通讯录管理器,添加到通讯录的人,可以按朋友/中立/敌人来区分。可以设定是否对某人静音,是否拒收某人发来的文本消息,等等。 (6)3D音效:TS3现在具有完整的3D音效支持,通过设置,不同人的声音可以定位到不同的空间位置,自己可以处在一个立体三维空间的任意点上,听到前后左右不同方位传来的声音。如果您的音箱/耳机支持5.1或7.1声道,将获得更完美的效果。 (7)可设定头像:您还可以设定自己喜欢的头像显示在自己的TS上。  TeamSpeak截图
TeamSpeak 3 延续了TeamSpeak 2的优良功能,并在TS2的基础上有大幅的改进。程序用C 完全重写,提供了更好的稳定性和扩展性。跨平台100%兼容,同时可以运行在WINDOWS全系列(32位和64位系统)、Linux(32位和64位系统)Mac OS X(苹果)操作系统上。新老用户都将享受到TeamSpeak3无与伦比的强大功能和全新的语音通讯体验。   TS3的新特性包括: (1)更清晰的语音质量和更好的延迟:TS3的语音质量有了一个质的飞跃。采用全新的speex和celt语音编码,分别适用于语音通话和音乐传输两种环境。并提供自动麦克风调整、先进的降噪和回声消除功能。语音的延迟也得到了明显的改善。 (2)可同时登录多个TS服务器:类似IE7、IE8的选项卡功能,TS3可以在同一个程序内打开多个选项卡,以方便同时登录多个TS服务器地址。 (3)强大的权限系统:TS3的权限系统完全不同于TS2,可以添加任意多的用户组,每个用户组的具体功能都可定制,基于频道、基于单个用户都可设置特别的权限。 (4)全新的用户认证系统:TS3引入了一个全新的认证系统,不同于用户名/密码的组合认证。登录TS3完全不需要用户名/密码。TS3会随时记忆您的独特身份,再也不需要为忘记用户名/密码苦恼了。 (5)好友管理:TS3拥有一个通讯录管理器,添加到通讯录的人,可以按朋友/中立/敌人来区分。可以设定是否对某人静音,是否拒收某人发来的文本消息,等等。 (6)3D音效:TS3现在具有完整的3D音效支持,通过设置,不同人的声音可以定位到不同的空间位置,自己可以处在一个立体三维空间的任意点上,听到前后左右不同方位传来的声音。如果您的音箱/耳机支持5.1或7.1声道,将获得更完美的效果。 (7)可设定头像:您还可以设定自己喜欢的头像显示在自己的TS上。                                        软件截图一                                                       软件截图二

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧