我正在为播放部分节目播放audio的项目工作。 我希望能够显示一条消息,如果用户的系统音量被静音。 我在Windows上使用Python。
使用Windows混音器API。 我已经为您找到了这篇文章,并附上相关的代码:(从MS KB 181550:“监视音频音量级别”)
这是在C中,但它也可以“翻译”到Python。
我希望有帮助。
#include <windows.h> #include <mmsystem.h> MMRESULT rc; // Return code. HMIXER hMixer; // Mixer handle used in mixer API calls. MIXERCONTROL mxc; // Holds the mixer control data. MIXERLINE mxl; // Holds the mixer line data. MIXERLINECONTROLS mxlc; // Obtains the mixer control. // Open the mixer. This opens the mixer with a deviceID of 0. If you // have a single sound card/mixer, then this will open it. If you have // multiple sound cards/mixers, the deviceIDs will be 0, 1, 2, and // so on. rc = mixerOpen(&hMixer, 0,0,0,0); if (MMSYSERR_NOERROR != rc) { // Couldn't open the mixer. } // Initialize MIXERLINE structure. ZeroMemory(&mxl,sizeof(mxl)); mxl.cbStruct = sizeof(mxl); // Specify the line you want to get. You are getting the input line // here. If you want to get the output line, you need to use // MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT. mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if (MMSYSERR_NOERROR == rc) { // Couldn't get the mixer line. } // Get the control. ZeroMemory(&mxlc, sizeof(mxlc)); mxlc.cbStruct = sizeof(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_PEAKMETER; mxlc.cControls = 1; mxlc.cbmxctrl = sizeof(mxc); mxlc.pamxctrl = &mxc; ZeroMemory(&mxc, sizeof(mxc)); mxc.cbStruct = sizeof(mxc); rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (MMSYSERR_NOERROR != rc) { // Couldn't get the control. } // After successfully getting the peakmeter control, the volume range // will be specified by mxc.Bounds.lMinimum to mxc.Bounds.lMaximum. MIXERCONTROLDETAILS mxcd; // Gets the control values. MIXERCONTROLDETAILS_SIGNED volStruct; // Gets the control values. long volume; // Holds the final volume value. // Initialize the MIXERCONTROLDETAILS structure ZeroMemory(&mxcd, sizeof(mxcd)); mxcd.cbStruct = sizeof(mxcd); mxcd.cbDetails = sizeof(volStruct); mxcd.dwControlID = mxc.dwControlID; mxcd.paDetails = &volStruct; mxcd.cChannels = 1; // Get the current value of the peakmeter control. Typically, you // would set a timer in your program to query the volume every 10th // of a second or so. rc = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE); if (MMSYSERR_NOERROR == rc) { // Couldn't get the current volume. } volume = volStruct.lValue; // Get the absolute value of the volume. if (volume < 0) volume = -volume;