1. 程式人生 > >基於OpenCV的視訊影象組態 (14):音量控制

基於OpenCV的視訊影象組態 (14):音量控制

實現程式碼

 編寫的播放軟體,慢慢地有了聲音控制的需求,在網上找了一下,用Core Audio APIS 音訊應用開發即可。入門稍慢,不過用起來很簡單。整理了一個類供呼叫。

class TCbwAudioEndpointVolumeCallback;

typedef void __fastcall (__closure * TOnVoiceNotifyEvent)(bool bMuted, int fMasterVolume);

class TCbwVolumeControl {

private:

    TCbwAudioEndpointVolumeCallback * EPVolEvents;

    TOnVoiceNotifyEvent FOnVoiceNotify;

    bool FValid;

    bool __fastcall HRStatus(HRESULT hr, UnicodeString info);

    void __fastcall Prework();

    void __fastcall AfterWork();

    int __fastcall GetMasterVolume();

    void __fastcall SetMasterVolume(int value);

    bool __fastcall GetMuted();

    void __fastcall SetMuted(bool value);

public:

    __fastcall TCbwVolumeControl();

    __fastcall ~TCbwVolumeControl();

    __property bool IsValid = { read = FValid };

 

    __property int MasterVolume = { read = GetMasterVolume, write = SetMasterVolume };

    __property bool Muted = { read = GetMuted, write = SetMuted };

    __property TOnVoiceNotifyEvent OnVoiceNotify = { read = FOnVoiceNotify, write = FOnVoiceNotify };

    void __fastcall OnNotifyFromCallback(bool bMuted, float fMasterVolume);

};

extern TCbwVolumeControl * GlobalVolumeControl;

 

 

TCbwVolumeControl * GlobalVolumeControl = NULL;

IMMDeviceEnumerator *pEnumerator = NULL;

IMMDevice *pDevice = NULL;

IAudioEndpointVolume *g_pEndptVol = NULL;

 

#define SAFE_RELEASE(punk) \

if ((punk) != NULL) \

{ (punk)->Release(); (punk) = NULL; }

#define EXIT_ON_ERROR(hr) \

if (FAILED(hr)) return;

 

__fastcall TCbwVolumeControl::TCbwVolumeControl() {

    EPVolEvents = new TCbwAudioEndpointVolumeCallback;

    FOnVoiceNotify = NULL;

    EPVolEvents->ParentControl = this;

    Prework();

}

 

__fastcall TCbwVolumeControl::~TCbwVolumeControl() {

    AfterWork();

    delete EPVolEvents;

}

 

bool __fastcall TCbwVolumeControl::HRStatus(HRESULT hr, UnicodeString info) {

    if (FAILED(hr)) {

        DRGRAPH_DEBUG(THelper::FormatString(L"CALL %s FAILED!", info));

        return false;

    }

    return true;

}

 

void __fastcall TCbwVolumeControl::Prework() {

    FValid = false;

    pEnumerator = NULL;

    pDevice = NULL;

    g_pEndptVol = NULL;

    GUID g_guidMyContext = GUID_NULL;

    CoInitialize(NULL);

    if (HRStatus(CoCreateGuid(&g_guidMyContext),

        L"CoCreateGuid(&g_guidMyContext)"))

        if (HRStatus(CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,

            CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator),

            (void**)&pEnumerator), L"CoCreateInstance"))

            if (HRStatus(pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole,

                &pDevice), L"pEnumerator->GetDefaultAudioEndpoint"))

                if (HRStatus(pDevice->Activate(__uuidof(IAudioEndpointVolume),

                    CLSCTX_ALL, NULL, (void**)&g_pEndptVol),

                    L"pDevice->Activate"))

                    if (HRStatus(g_pEndptVol->RegisterControlChangeNotify

                        ((IAudioEndpointVolumeCallback*)EPVolEvents),

                        L"g_pEndptVol->RegisterControlChangeNotify"))

                        FValid = true;

}

 

void __fastcall TCbwVolumeControl::AfterWork() {

    if (pEnumerator != NULL) {

        HRStatus(g_pEndptVol->UnregisterControlChangeNotify

            ((IAudioEndpointVolumeCallback*) EPVolEvents),

            L"g_pEndptVol->UnregisterControlChangeNotify");

    }

    SAFE_RELEASE(pEnumerator);

    SAFE_RELEASE(pDevice);

    SAFE_RELEASE(g_pEndptVol);

    CoUninitialize();

}

 

int __fastcall TCbwVolumeControl::GetMasterVolume() {

    float pfLevel = 0;

    HRStatus(g_pEndptVol->GetMasterVolumeLevelScalar(&pfLevel),

        L"g_pEndptVol->GetMasterVolumeLevel");

    return pfLevel * 100 + 0.5;

}

 

void __fastcall TCbwVolumeControl::SetMasterVolume(int value) {

    float fVolume = value / 100.0;

    HRStatus(g_pEndptVol->SetMasterVolumeLevelScalar(fVolume,

        &GUID_NULL), L"pAudioEndpointVolume->SetMasterVolumeLevelScalar");

}

 

void __fastcall TCbwVolumeControl::OnNotifyFromCallback(bool bMuted,

    float fMasterVolume) {

    if (FOnVoiceNotify)

        FOnVoiceNotify(bMuted, fMasterVolume * 100 + 0.5);

}

 

bool __fastcall TCbwVolumeControl::GetMuted() {

    int muted = false;

    g_pEndptVol->GetMute(&muted);

    return muted;

}

 

void __fastcall TCbwVolumeControl::SetMuted(bool value) {

    HRStatus(g_pEndptVol->SetMute(value,

        &GUID_NULL), L"pAudioEndpointVolume->SetMute");

}


演示效果

簡單做了一個測試介面。

void __fastcall TMainForm::OnVoiceNotify(bool bMuted, int fMasterVolume) {
    Button_Mute->EditValue = bMuted;
    Button_Volume->EditValue = fMasterVolume;
}

void __fastcall TMainForm::Button_MutePropertiesEditValueChanged(TObject *Sender) {
    bool muted = Button_Mute->CurEditValue;
    int volume = Button_Volume->CurEditValue;
    ShowStatus(THelper::FormatString(L"%d, %s", volume, muted ? L"Muted" : L"Sound"));
    FVolumeControl->MasterVolume = volume;
    FVolumeControl->Muted = muted;
}


相關推薦

基於OpenCV視訊影象 (14)音量控制

實現程式碼  編寫的播放軟體,慢慢地有了聲音控制的需求,在網上找了一下,用Core Audio APIS 音訊應用開發即可。入門稍慢,不過用起來很簡單。整理了一個類供呼叫。 class TCbwAudioEndpointVolumeCallback; typede

基於OpenCV視訊影象 (6) 形狀動畫效果

形狀效果 形狀效果:顯示目標區域位置不變,顯示內容(原始陣不變,遮蔽陣變化 -> 顯示內容變化) enum CbwShapeDirection { // 形狀方向 csdZoomIn = 0, // 放大 csdZoomOut =

基於OpenCV視訊影象 (4) 劈裂動畫效果

寫在前面 本系列部落格URL: 配套軟體下載地址: 配套軟體含四個可執行檔案:DrGraph.exe,YeeVingDriver.exe,YeeVingPlayer.exe,WatchDog.exe 其中, DrGraph.exe為圖形博士軟體,可進行電路

基於OpenCV視訊影象 (8) 隨機線條動畫效果

隨機線條效果實現 class TCbwAnimationEffect_RandomLine : public TCbwAnimationEffect { // 隨機線 virtual bool __fastcall BuildMaskMat(cv::Mat&a

基於OpenCV視訊影象 (10) CEF瀏覽器與圖形軟體互嵌

開發者工具 CEF核心很強大,已經提供相當多的功能。 比如開發者工具,呼叫是如此的簡單。 稍微包裝一下,宣告一個屬性 __property bool ShowDevTool = { read = GetDevToolVisible, write = Se

基於OpenCV視訊影象 (2) 動畫總體

/** *@class TCbwAnimationEffect *@brief 動畫基類 * * 處理動畫基本內容 *@author DrGraph *@version 1.0 *@date 2017-10-07 *@QQ: 282397369 */ class TC

基於OpenCV的視頻 (1) 時鐘

oot 這般 ctc .cn email 定制 ima ret locked 寫在前面 本系列博客URL: http://www.cnblogs.com/drgraph http://blog.csdn.net/arwen 配套軟件下載地址: http://ww

基於OpenCV的視頻 (2) 動畫總體

tag evo odm enc 底部 direction san 基本上 界面 寫在前面 本系列博客URL: http://www.cnblogs.com/drgraph http://blog.csdn.net/arwen 配套軟件下載地址: http://w

基於OpenCV的視頻 (3)常見PPT動畫1

app 基本 rom font uil 簡單 ren .net 記錄 寫在前面 本系列博客URL: http://www.cnblogs.com/drgraph http://blog.csdn.net/arwen 配套軟件下載地址: http://www.cz

基於OpenCV影象分割

1、影象閾值化 原始碼: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace std; using

基於OpenCV影象恢復

根據自適應濾波原理,設計一種可較好的保留底紋細節的自適應中值濾波器,對下圖1進行恢復(5%椒鹽噪聲),要求達到圖2的效果。 圖1 圖2 用visual studio 2012實現的程式碼如下: 特別注意的是,把要處理的圖片放在工程目錄下!!! #include<opencv2/

基於OpenCV影象形態學處理

1、形態學概述 一詞通常表示生物學的個分支,該主要研究動植形態 和結構 。 而我們影象處理中的形態學,往指是數學形態學。 最基本的形態學操作有兩種:膨脹和腐蝕 膨脹:(dilate)就是求區域性最大值的操作。從數學角度來說,膨脹或者腐蝕操作就是講影象(或影象的一部分割槽域,稱之為A)與核(稱

基於opencv影象縮放,旋轉,透視變換。

工具程式碼: #define WARPSTEPSIZE 0.2; #define RESIZESTEPSIZE 0.1; #define ROTATESTEPSIZE 10; float g_H_value = 0; float g_resize_value = 0;

基於opencv影象旋轉匹配

.h檔案 #ifndef _OPENCV_fftm_HPP_ #define _OPENCV_fftm_HPP_ #ifdef __cplusplus #include "opencv2/core.hpp" #include "opencv2/opencv.hpp" //

基於Opencv計算影象的均值和方差

實現每幅影象的每一個通道求均值和方差。 //這裡是三通道的影象    for(i=0;i<3;i++)  //求均值     {         m[i]=0;         for(x=0;x<src->height;x++)         {  

【LeetCode & 劍指offer刷題】數1461 撲克牌中的順子

.net pac mil ace height 數字 emp sco 目錄 【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 61 撲克牌中的順子 從撲克牌中隨機抽 5 張牌,判斷是不是順子,即這 5 張牌是不是連續的。 2-10 為數字

Basler工業相機基於opencv 採集影象

本實驗在兩個部落格的基礎上實現的,首先是配置opencv http://blog.csdn.net/lili2425960/article/details/54234299 先前查了一些關於win10+opencv3.0(2.xx)+vs配置的文章,準備以此為樣本來配置

OpenCV數字影象處理十一利用分段線性化處理影象 在某些情況效果很實用

分段線性變換 分段線性變換也叫做灰度線性拉伸,常用的是分三段分線性變換。如下圖: 圖中對灰度區間[a,b]進行了擴充套件,而灰度區間[0, a]和[b, Mf]收到了壓縮。通過細心調整折線拐點的位置及控制分段直線的斜率,可對任意灰度區間進行擴充套件和壓縮。、本文就是基

Python-OpenCV 處理影象(一)基本操作 cv2

0x00. 圖片讀、寫和顯示操作 安裝好 OpenCV 之後,首先嚐試載入一張最簡單的圖片並顯示出來,程式碼示例: 第一種方式使用cv2.cv的LoadImage、ShowImage和SaveImage函式 import cv2.cv as cv # 讀圖片 image=cv.LoadImage('img

基於FPGA視訊影象處理系統設計

摘要 本報告給出一個基於FPGA+兩片DDR2組成的核心板、帶有4路視訊輸入和VGA介面的開發板進行的視訊影象採集和處理系統的設計。使用TW2867進行視訊輸入訊號的編碼,儲存到DDR2中,通過FPGA和ARM的聯合控制,通過I2C匯流排進行通訊,進行數字影