基於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刷題】數組題14:61 撲克牌中的順子
.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匯流排進行通訊,進行數字影