HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0828
あままVista以降でのマスターボリューム6解決


あまま

リンク

2010/8/28(Sat) 07:55:19|NO.34666

XPまではwinmm.dllで音量の取得や変更が可能だったんですが、
Vista以降ではこの方法だとアプリケーション単体の
音量調節しか出来なくなってしまいました。

Vistaでマスターボリュームの取得・変更を行なうにはどうしたらよいでしょうか?



この記事に返信する


u

リンク

2010/8/28(Sat) 09:24:10|NO.34667

私も昔突っかかりましたが、アプリ単体での調節はVistaから導入された為COMを使うしかないようです。
Core Audio APIとのことですが、日本語資料は少ないですね。
http://www.google.com/search?hl=ja&client=opera&hs=M8o&rls=ja&q=Core+Audio+APIs+in+Windows+Vista&revid=2120610948&sa=X&ei=clV4TJH5GcqecfeCiKYG&ved=0CBMQ4QIoAA



inovia

リンク

2010/8/28(Sat) 11:06:55|NO.34671

拙作プラグインhspdsp.dllにてVista以降のボリューム変更に対応しています。
http://awplus.jp/soft/page1/yd/hspdsp.html



あまま

リンク

2010/8/28(Sat) 13:41:25|NO.34674

> inoviaさん
返信ありがとうございます。
音量だけでなくミュートの操作も行なう予定ですので、
今回はCOMを使用とさせていただこうかと考えております。



>uさん
ありがとうございます。
Core Audio APIについて色々と調べ、
検索の中で見つけたこちらのソースををHSPに書き換えてみました。
http://blogs.msdn.com/b/larryosterman/archive/2007/03/06/how-do-i-change-the-master-volume-in-windows-vista.aspx

しかし30行目でエラーとなってしまいます。

#uselib "ole32.dll" #cfunc CoInitialize "CoInitialize" sptr #cfunc CoCreateInstance "CoCreateInstance" sptr, sptr, sptr, sptr, sptr #func CoUninitialize "CoUninitialize" #define CLSID_MMDeviceEnumerator "{BCDE0395-E52F-467C-8E3D-C4579291692E}" #define IID_IMMDeviceEnumerator "{A95664D2-9614-4F35-A746-DE8DB63617E6}" #define IID_IMMDevice "{D666063F-1587-4E43-81F1-B948E807363F}" #define IID_IMMDeviceCollection "{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}" #define IID_IAudioEndpointVolume "{5CDF2C82-841E-4546-9722-0CF74078229A}" #define IID_IAudioMeterInformation "{C02216F6-8C67-4B5B-9D00-D008E73E0064}" #define IID_IAudioEndpointVolumeCallback "{657804FA-D6AD-4496-8A60-352752AF4F89}" #define NULL 0 #define CLSCTX_INPROC_SERVER 0x01 #const eRender 0x00000000 #const eConsole 0x00000000 hr = CoInitialize( NULL ); mes hr newcom deviceEnumerator, IID_IMMDeviceEnumerator; hr = CoCreateInstance( CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, varptr( deviceEnumerator ) ); mes hr newcom defaultDevice, IID_IMMDevice; comres hr; mcall deviceEnumerator, "GetDefaultAudioEndpoint", eRender, eConsole, varptr( defaultDevice ); mcall deviceEnumerator, "Release"; newcom endpointVolume, IID_IAudioEndpointVolume; mcall defaultDevice, "Activate", IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, varptr( endpointVolume ); mcall defaultDevice, "Release"; VolumeLevel = 0.0; mcall endpointVolume, "GetMasterVolumeLevel", varptr( VolumeLevel ); mes VolumeLevel; mcall endpointVolume, "GetMasterVolumeLevelScalar", varptr( VolumeLevel ); mes VolumeLevel; mcall endpointVolume, "Release"; CoUninitialize; stop


正常に取得するにはどうしたらよいのでしょうか。

よろしくお願いします。



inovia

リンク

2010/8/28(Sat) 14:48:59|NO.34676

> 音量だけでなくミュートの操作も行なう予定ですので、
hspdsp.dllは Vista以降でのミュート操作にも対応しています。

とりあえず、hspdsp.dllのボリューム操作部分をHSPに移植してみました。


#module #define CLSID_IMMDeviceEnumerator "{BCDE0395-E52F-467C-8E3D-C4579291692E}" #define IID_IMMDeviceEnumerator "{A95664D2-9614-4F35-A746-DE8DB63617E6}" #define IID_IMMDevice "{D666063F-1587-4E43-81F1-B948E807363F}" #define IID_IAudioEndpointVolume "{5CDF2C82-841E-4546-9722-0CF74078229A}" #define ERender 0x00000000 #define Console 0x00000000 #usecom IMMDeviceEnumerator IID_IMMDeviceEnumerator CLSID_IMMDeviceEnumerator #comfunc Enumerator_GetDefaultAudioEndpoint 4 int,int,var #usecom IMMDevice IID_IMMDevice CLSID_IMMDeviceEnumerator #comfunc Device_Activate 3 var,int,int,var #usecom IAudioEndpointVolume IID_IAudioEndpointVolume CLSID_IMMDeviceEnumerator #comfunc Volume_SetMasterVolumeLevelScalar 7 float,var #comfunc Volume_GetMasterVolumeLevelScalar 9 var #comfunc Volume_SetMute 14 int,int #comfunc Volume_GetMute 15 var #defcfunc todouble int p1 temp = 0.0 lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000) lpoke temp, 0, p1 << 29 return temp #deffunc _OpenDevice newcom pMMDeviceEnumerator,IMMDeviceEnumerator if varuse(pMMDeviceEnumerator) = 0 : _CloseDevice : return -1 newcom pMMDevice,IMMDevice,-1,0 newcom pAudioEndpointVolume,IAudioEndpointVolume,-1,0 Enumerator_GetDefaultAudioEndpoint pMMDeviceEnumerator,ERender,Console,pMMDevice if varuse(pMMDevice) = 0 : _CloseDevice : return -2 uuid = 0x5CDF2C82 , 0x4546841E , 0xF70C2297 , 0x9A227840 Device_Activate pMMDevice,uuid,1,0,pAudioEndpointVolume if varuse(pAudioEndpointVolume) = 0 : _CloseDevice : return -3 return 0 #deffunc _CloseDevice if vartype(pAudioEndpointVolume) = 6{ if varuse(pAudioEndpointVolume) != 0{ delcom pAudioEndpointVolume } } if vartype(pMMDevice) = 6{ if varuse(pMMDevice) != 0{ delcom pMMDevice } } if vartype(pMMDeviceEnumerator) = 6{ if varuse(pMMDeviceEnumerator) != 0{ delcom pMMDeviceEnumerator } } return #deffunc SetMasterVolumeVista int vol _OpenDevice if stat<0 : return stat uuid = 0,0,0,0 Volume_SetMasterVolumeLevelScalar pAudioEndpointVolume,1.0f*(double(vol)/100.0f),uuid _CloseDevice return #defcfunc GetMasterVolumeVista _OpenDevice if stat<0 : return stat vol = 0 Volume_GetMasterVolumeLevelScalar pAudioEndpointVolume,vol _CloseDevice return int(todouble(vol)*100.0f) #deffunc SetMuteVista int flag _OpenDevice if stat<0 : return stat Volume_SetMute pAudioEndpointVolume,flag,0 _CloseDevice return #defcfunc GetMuteVista _OpenDevice if stat<0 : return stat res = 0 Volume_GetMute pAudioEndpointVolume,res _CloseDevice return res #global // ミュートに設定 SetMuteVista 1 mes GetMuteVista() // ミュート解除 SetMuteVista 0 mes GetMuteVista() // ボリュームを30にセット(0〜100) SetMasterVolumeVista 30 mes GetMasterVolumeVista()



inovia

リンク

2010/8/28(Sat) 14:59:33|NO.34677

floatからdoubleに変換する方法は以下を参考にしました。
というよりそのまんまです〜(^_^;)

http://sprocket.babyblue.jp/html/hsp_koneta3.htm#tofloat



あまま

リンク

2010/8/28(Sat) 15:59:04|NO.34678

モジュールの制作ありがとうございます。
だいぶ間違っていたようですね^^;

> hspdsp.dllは Vista以降でのミュート操作にも対応しています。
失礼しました。
せっかくなので今回は作成していただいたモジュールを使わせていただきます。

どうもありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.