Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby obsługiwać aplikacje systemu Windows wyświetlające mierniki szczytowe, interfejs API EndpointVolume zawiera interfejs IAudioMeterInformation. Ten interfejs reprezentuje miernik szczytowy na urządzeniu punktu końcowego audio . W przypadku urządzenia renderowania wartość pobrana z miernika szczytowego reprezentuje maksymalną wartość próbki napotkaną w strumieniu wyjściowym do urządzenia w poprzednim okresie pomiaru. W przypadku urządzenia przechwytywania wartość pobrana z miernika szczytowego reprezentuje maksymalną wartość próbki napotkaną w strumieniu wejściowym z urządzenia.
Wartości miernika szczytowego uzyskane z metod w interfejsie IAudioMeterInformationsą liczbami zmiennoprzecinkowymi w znormalizowanym zakresie od 0,0 do 1,0. Jeśli na przykład strumień PCM zawiera 16-bitowe próbki, a szczytowa wartość próbki w danym okresie pomiaru to —8914, wartość bezwzględna zarejestrowana przez miernik szczytowy wynosi 8914, a znormalizowana wartość szczytowa zgłoszona przez interfejs IAudioMeterInformation wynosi 8914/32768 = 0,272.
Jeśli urządzenie punktu końcowego audio implementuje miernik szczytowy w sprzęcie, interfejs IAudioMeterInformation używa miernika szczytu sprzętu. W przeciwnym razie interfejs implementuje miernik szczytowy w oprogramowaniu.
Jeśli urządzenie ma miernik szczytowy sprzętu, miernik szczytowy jest aktywny zarówno w trybie udostępnionym, jak i w trybie wyłącznym. Jeśli urządzenie nie ma miernika szczytu sprzętu, miernik szczytowy jest aktywny w trybie udostępnionym, ale nie w trybie wyłącznym. W trybie wyłączności aplikacja i sprzęt audio wymieniają dane audio bezpośrednio, pomijając miernik szczytowy oprogramowania (który zawsze zgłasza szczytową wartość 0,0).
Poniższy przykład kodu C++ to aplikacja systemu Windows, która wyświetla miernik szczytowy dla domyślnego urządzenia renderowania:
// Peakmeter.cpp -- WinMain and dialog box functions
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include "resource.h"
static BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
static void DrawPeakMeter(HWND, float);
// Timer ID and period (in milliseconds)
#define ID_TIMER 1
#define TIMER_PERIOD 125
#define EXIT_ON_ERROR(hr) \
if (FAILED(hr)) { goto Exit; }
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
//-----------------------------------------------------------
// WinMain -- Opens a dialog box that contains a peak meter.
// The peak meter displays the peak sample value that plays
// through the default rendering device.
//-----------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HRESULT hr;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDevice *pDevice = NULL;
IAudioMeterInformation *pMeterInfo = NULL;
if (hPrevInstance)
{
return 0;
}
CoInitialize(NULL);
// Get enumerator for audio endpoint devices.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IMMDeviceEnumerator),
(void**)&pEnumerator);
EXIT_ON_ERROR(hr)
// Get peak meter for default audio-rendering device.
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
EXIT_ON_ERROR(hr)
hr = pDevice->Activate(__uuidof(IAudioMeterInformation),
CLSCTX_ALL, NULL, (void**)&pMeterInfo);
EXIT_ON_ERROR(hr)
DialogBoxParam(hInstance, L"PEAKMETER", NULL, (DLGPROC)DlgProc, (LPARAM)pMeterInfo);
Exit:
if (FAILED(hr))
{
MessageBox(NULL, TEXT("This program requires Windows Vista."),
TEXT("Error termination"), MB_OK);
}
SAFE_RELEASE(pEnumerator)
SAFE_RELEASE(pDevice)
SAFE_RELEASE(pMeterInfo)
CoUninitialize();
return 0;
}
//-----------------------------------------------------------
// DlgProc -- Dialog box procedure
//-----------------------------------------------------------
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static IAudioMeterInformation *pMeterInfo = NULL;
static HWND hPeakMeter = NULL;
static float peak = 0;
HRESULT hr;
switch (message)
{
case WM_INITDIALOG:
pMeterInfo = (IAudioMeterInformation*)lParam;
SetTimer(hDlg, ID_TIMER, TIMER_PERIOD, NULL);
hPeakMeter = GetDlgItem(hDlg, IDC_PEAK_METER);
return TRUE;
case WM_COMMAND:
switch ((int)LOWORD(wParam))
{
case IDCANCEL:
KillTimer(hDlg, ID_TIMER);
EndDialog(hDlg, TRUE);
return TRUE;
}
break;
case WM_TIMER:
switch ((int)wParam)
{
case ID_TIMER:
// Update the peak meter in the dialog box.
hr = pMeterInfo->GetPeakValue(&peak);
if (FAILED(hr))
{
MessageBox(hDlg, TEXT("The program will exit."),
TEXT("Fatal error"), MB_OK);
KillTimer(hDlg, ID_TIMER);
EndDialog(hDlg, TRUE);
return TRUE;
}
DrawPeakMeter(hPeakMeter, peak);
return TRUE;
}
break;
case WM_PAINT:
// Redraw the peak meter in the dialog box.
ValidateRect(hPeakMeter, NULL);
DrawPeakMeter(hPeakMeter, peak);
break;
}
return FALSE;
}
//-----------------------------------------------------------
// DrawPeakMeter -- Draws the peak meter in the dialog box.
//-----------------------------------------------------------
void DrawPeakMeter(HWND hPeakMeter, float peak)
{
HDC hdc;
RECT rect;
GetClientRect(hPeakMeter, &rect);
hdc = GetDC(hPeakMeter);
FillRect(hdc, &rect, (HBRUSH)(COLOR_3DSHADOW+1));
rect.left++;
rect.top++;
rect.right = rect.left +
max(0, (LONG)(peak*(rect.right-rect.left)-1.5));
rect.bottom--;
FillRect(hdc, &rect, (HBRUSH)(COLOR_3DHIGHLIGHT+1));
ReleaseDC(hPeakMeter, hdc);
}
W poprzednim przykładzie kodu funkcja WinMain wywołuje funkcję CoCreateInstance, aby utworzyć wystąpienie interfejsu IMMDeviceEnumerator i wywołuje IMMDeviceEnumerator::GetDefaultAudioEndpoint metodę uzyskiwania interfejsu IMMDevice domyślnego urządzenia renderowania. WinMain wywołuje metodę IMMDevice::Activate w celu uzyskania interfejsuIAudioMeterInformation urządzenia i otwiera okno dialogowe w celu wyświetlenia miernika szczytowego dla urządzenia. Aby uzyskać więcej informacji na temat WinMain i CoCreateInstance, zobacz dokumentację zestawu Windows SDK. Aby uzyskać więcej informacji na temat IMMDeviceEnumerator i IMMDevice, zobacz Wyliczanie urządzeń audio.
W poprzednim przykładzie kodu funkcja DlgProc wyświetla miernik szczytowy w oknie dialogowym. Podczas przetwarzania komunikatu WM_INITDIALOG dlgProc wywołuje funkcję SetTimer w celu skonfigurowania czasomierza, który będzie generować komunikaty WM_TIMER w regularnych odstępach czasu. Gdy dlgProc odbiera komunikat WM_TIMER, wywołuje IAudioMeterInformation::GetPeakValue w celu uzyskania najnowszego odczytu miernika szczytu dla strumienia. Następnie dlgProc wywołuje funkcję DrawPeakMeter, aby narysować zaktualizowany miernik szczytowy w oknie dialogowym. Aby uzyskać więcej informacji na temat setTimer oraz komunikatów WM_INITDIALOG i WM_TIMER, zobacz dokumentację zestawu Windows SDK.
Możesz łatwo zmodyfikować poprzedni przykładowy kod, aby wyświetlić miernik szczytowy dla domyślnego urządzenia przechwytywania. W funkcji WinMain zmień wartość pierwszego parametru w wywołaniu metody IMMDeviceEnumerator::GetDefaultAudioEndpoint z eRender na eCapture.
Poniższy przykład kodu to skrypt zasobu, który definiuje kontrolki, które są wyświetlane w poprzednim przykładzie kodu:
// Peakmeter.rc -- Resource script
#include "resource.h"
#include "windows.h"
//
// Dialog
//
PEAKMETER DIALOGEX 0, 0, 150, 34
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_SETFONT
CAPTION "Peak Meter"
FONT 8, "Arial Rounded MT Bold", 400, 0, 0x0
BEGIN
CTEXT "",IDC_PEAK_METER,34,14,82,5
LTEXT "Min",IDC_STATIC_MINVOL,10,12,20,12
RTEXT "Max",IDC_STATIC_MAXVOL,120,12,20,12
END
Poniższy przykład kodu to plik nagłówka zasobu, który definiuje identyfikatory kontrolek, które są wyświetlane w poprzednich przykładach kodu:
// Resource.h -- Control identifiers
#define IDC_STATIC_MINVOL 1001
#define IDC_STATIC_MAXVOL 1002
#define IDC_PEAK_METER 1003
Tematy pokrewne