音量調節


Fusa  URL  2009-11-29 13:54:19  No: 36349  IP: 192.*.*.*

こんにちは。

音量を調節したいと思い
調べてみたのですが

Vivasoft - Delphi
http://www.terra.dti.ne.jp/~vivas/delphi/index.html#TMixer

こちらのプログラムでWindowsXPでなら
音量調節ができ、ミュートON/OFFもできることがわかったのですが
WindowsVistaでは動きませんでした。

また、使い勝手がかなり難しい感じもしています。

デバイスごとの音量の調節は必要ないので
WindowsXPでも、WindowsVistaでも
単に、音量の上下とミュートのON/OFFを行うやり方を
ご存知の方おられましたら、教えてください。

よろしくお願いします。

編集 削除
monaa  2009-11-29 16:28:03  No: 36350  IP: 192.*.*.*

多分コンポーネントにバグがあるんじゃないですかね?
と見てないコンポーネントの指摘をしてみる。

http://hp.vector.co.jp/authors/VA016117/winsdk.html
ミキサー  その1(音量の調節)
ミキサー  その2(ミュート)
Vista以降の注意
http://data.blogdns.net/blog/2007/12/core-audio-api.html

編集 削除
Fusa  URL  2009-11-29 16:57:18  No: 36351  IP: 192.*.*.*

なるほど、バグがあっても動いてたけど
Vistaでは厳密になったので動かないと。

そういう理由なんですね。
調べてみます。

検索してもたどりついていない情報でした。ありがとうございます。

編集 削除
ウワのソラ  2009-11-29 20:19:46  No: 36352  IP: 192.*.*.*

春子:「XPならmixerAPIでボリュームの調整できるけどね、VISTAはダメだと思うよ」
真琴:「ふ〜ん、そうなの?」
春子:「そぅ、VISTAはCOMでやるみたい、こんなカンジなのかな? 持ってないから試せないけど」

  ...........
var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  ActiveX, MMDevAPI;
var
  AudioEndpointVolume: IAudioEndpointVolume = nil;

procedure TForm1.FormCreate(Sender: TObject);
var
  mmDeviceEnumerator: IMMDeviceEnumerator;
  mmDevice: IMMDevice;
begin
  CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, mmDeviceEnumerator);
  if mmDeviceEnumerator = nil then exit;
  mmDeviceEnumerator.GetDefaultAudioEndpoint(ERender, EConsole, mmDevice);
  mmDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, AudioEndpointVolume);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Volume: Single;
begin
  if AudioEndpointVolume = nil then exit;
  Volume := 0.3;
  AudioEndpointVolume.SetMasterVolumeLevelScalar(Volume, nil);
end;

end.

-----------------------------------------------------------------
unit MMDevAPI;

interface

uses
  Windows, ActiveX, ComObj;

const
  CLASS_IMMDeviceEnumerator             : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
  IID_IMMDeviceEnumerator               : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
  IID_IMMDevice                         : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
  IID_IMMDeviceCollection               : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
  IID_IAudioEndpointVolume              : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
  IID_IAudioMeterInformation            : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
  IID_IAudioEndpointVolumeCallback      : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';

  DEVICE_STATE_ACTIVE                   = $00000001;
  DEVICE_STATE_UNPLUGGED                = $00000002;
  DEVICE_STATE_NOTPRESENT               = $00000004;
  DEVICE_STATEMASK_ALL                  = $00000007;

type
  EDataFlow = TOleEnum;

const
  ERender                               = $00000000;
  ECapture                              = $00000001;
  EAll                                  = $00000002;
  EDataFlow_enum_count                  = $00000003;

type
  ERole = TOleEnum;

const
  EConsole                              = $00000000;
  EMultimedia                           = $00000001;
  ECommunications                       = $00000002;
  ERole_enum_count                      = $00000003;

type
  IAudioEndpointVolumeCallback = interface(IUnknown)
   ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
  end;

  IAudioEndpointVolume = interface(IUnknown)
   ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
    function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
    function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
    function GetChannelCount(out PInteger): Integer; stdcall;
    function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
    function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
    function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
    function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
    function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: Double; pguidEventContext: PGUID): Integer; stdcall;
    function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: Double; pguidEventContext: PGUID): Integer; stdcall;
    function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: Double): Integer; stdcall;
    function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: Double): Integer; stdcall;
    function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
    function GetMute(out bMute: Boolean): Integer; stdcall;
    function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
    function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
    function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
    function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
    function GetVolumeRange(out pflVolumeMindB: Double; out pflVolumeMaxdB: Double; out pflVolumeIncrementdB: Double): Integer; stdcall;
  end;

  IAudioMeterInformation = interface(IUnknown)
   ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
  end;

  IPropertyStore = interface(IUnknown)
  end;

type
  IMMDevice = interface(IUnknown)
   ['{D666063F-1587-4E43-81F1-B948E807363F}']
    function Activate(const refId: TGUID;
                      dwClsCtx: DWORD;
                      pActivationParams: PInteger;
                      out pEndpointVolume: IAudioEndpointVolume): Hresult; stdcall;
    function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
    function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
    function GetState(out State: Integer): Hresult; stdcall;
  end;


  IMMDeviceCollection = interface(IUnknown)
   ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
  end;

  IMMNotificationClient = interface(IUnknown)
   ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
  end;

  IMMDeviceEnumerator = interface(IUnknown)
   ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
    function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
    function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev: IMMDevice ): Hresult; stdcall;
    function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
    function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
  end;


implementation

end.

真琴:「ぁ…そうなの…」
春子:「ん? マコト? ナンかウワのソラってカンジね、どうかしたの?」
真琴:「アタシ、今それどころじゃなくて…おじいちゃんが死んじゃうかも…ナンとかしないと…」
春子:「えっ? 突然ナニ言い出すの? マコト、どういうコト?」
真琴:「アタシ、夢をみたの、おじいちゃんは台風が近づいた海でサーフィンするつもり…それで…」
春子:「マコト、台風なんか来てないよ、それにマサルさんはサーフィンなんか…」
真琴:「ハルコさん、アタシが言ってるのは、コッチじゃなくてアッチのコト」
春子:「アッチって、ドッチ? …ていうか、それって夢なんでしょ?」
真琴:「でも夢でアタシはアッチを見てきたの、アタシたちが居なくなって、おじいちゃんは今一人ぼっち…」
春子:「もしかして…アッチって、以前にアタシたちが居た4年後のコト?」
真琴:「そう、アタシ、理屈は分からない…けど、その夢でハッキリ気付いたの、ここはアッチとは別の宇宙だってコト…、コッチの時間は4年くらい遅れてるの」
春子:「あ…それって…並行宇宙? …でも、どうして一人ぼっち? アッチにはビーチボーイズの二人が一緒に居るはずなのに」
真琴:「そんな人たちは居なかった、…寂しさを紛らわすためにおじいちゃんはサーフィンをまた始めたみたい」
春子:「あら、そう? だけど、マコトがホントに行ったのなら、ナンで説得して止めさせなかったの?」
真琴:「それがダメ…、アタシの体はアッチに行っていない、だからアタシに気付いてくれない…、ハルコさん、おじいちゃんを助けたいよ、でもどうしたらいいの?」
春子:「う〜ん、そうなの…、アッチの一人ぼっちのマサルさんが死ぬかもしれない? …じゃぁ、その前にコッチに連れてこれれば…」
真琴:「え? おじいちゃんをコッチに? ハルコさん、そんなコト出来る?」
春子:「アタシだけでは絶対に無理、でも、マコトの力を借りれば、あるいは…」

編集 削除
Fusa  2009-12-02 10:23:52  No: 36353  IP: 192.*.*.*

・・・すごい内容っすね・・・

詳細、調べてからお返事するです。

編集 削除