- PR -

C#でWindowsサウンドミキサーのミュートコントロール

1
投稿者投稿内容
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-11-13 00:55
Togと申します。

C#でWindowsサウンドミキサーのLineInのミュート設定を行いたいと思っています。
WinmmAPIを使うことで可能だと思い調べている中でVB6で書かれたWEBページがありました。

http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q178456&

http://beta.experts-exchange.com/Programming/Programming_Languages/Dot_Net/Q_20781858.html

これを参考にC#に置き換えてみたのですが、mixerGetLineControlsでErrorが帰ってきてしまいどうしてもうまくできないでいます。

また置き換える中でよくわからなかった部分でvb6で書かれた

コード:
Private Const MIXERCONTROL_CONTROLTYPE_BOOLEAN = (MIXERCONTROL_CT_CLASS_SWITCH Or MIXERCONTROL_CT_SC_SWITCH_BOOLEAN Or MIXERCONTROL_CT_UNITS_BOOLEAN)
Private Const MIXERCONTROL_CONTROLTYPE_ONOFF = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1)
Private Const MIXERCONTROL_CONTROLTYPE_MUTE = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)



はC#でどのように置き換えられるのでしょうか。 OR で結んだデータに + 1 や + 2 という意味がどうにも解せません。

他の方法ででもc#からミュートコントロールできる方法があればアドバイスいただけないでしょうか。

よろしくお願いいたします。



きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-11-13 09:18
Togさん、お早うございます。

# 本題については判りませんが...。
引用:

コード:
Private Const MIXERCONTROL_CONTROLTYPE_ONOFF = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1)
Private Const MIXERCONTROL_CONTROLTYPE_MUTE = (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)



はC#でどのように置き換えられるのでしょうか。 OR で結んだデータに + 1 や + 2 という意味がどうにも解せません。


.net以前のVbでは、数値を論理値に暗黙変換する際に、 0 は False、0 以外の数値は True として判断されます。逆の場合、False は 0 に、True は 1 (だったか -1 だったか定かでない)に変換されます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-11-13 09:50
unibon です。こんにちわ。

引用:

Togさんの書き込み (2003-11-13 00:55) より:
はC#でどのように置き換えられるのでしょうか。 OR で結んだデータに + 1 や + 2 という意味がどうにも解せません。


下位の数ビットは算術値になっていて、それ以外の上位のビットは論理値として使っていて、
混在しているのでしょう。
C# は良く知らないのですが、単純な int の演算で良いと思います。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2003-11-13 21:42
検索で下のようなページを見つけました。

http://www.terra.dti.ne.jp/~vivas/delphi/mixerapi.html

オーディオミキサーの操作の概要が書いてあるようです。
これを参考にしつつ、リファレンスと格闘すればお望みの操作は出来そうな気がします。

APIをC#から呼ぶ(dllの関数を呼ぶ、でしょうけど)方法についてはMSDNの
プラットフォーム呼び出しによるデータのマーシャリング」や

http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/026w32struct/w32struct.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html

ここの Tips でこの辺が参考になると思います。


引用:

はC#でどのように置き換えられるのでしょうか。 OR で結んだデータに + 1 や + 2 という意味がどうにも解せません。



これについては「mmsystem.h にそう書いてあるから」です。これ以上は推測になりますので、正確なところはわかりませんが

引用:

下位の数ビットは算術値になっていて、それ以外の上位のビットは論理値として使っていて、
混在しているのでしょう。



自分もこんなところだろうと思います。ただ、uintの演算と考えたほうがいい気がします。フラグとしての利用でしょうから。


リンクばかりのレスですいません。まじめに説明するとすごい量になってしまいますので。
最後に一言いうと、個人的には時間がないのならばこの部分は MC++ で書いて dll にしたほうがいいと思います。時間があるなら C# でかく方がよいと思いますが。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-11-14 10:06
# 相変わらず本題とは関係ありませんが...。

引用:

False は 0 に、True は 1 (だったか -1 だったか定かでない)に変換されます。


True は -1 でした。

ところで、定数名 "〜_BOOLEAN" から勝手に論理値だと判断しましたが、Or で演算しているそれぞれの定数が数値だった場合、Or はビット演算になりますね。但し、1つでも論理値が含まれていると、論理演算になっちゃいますけど。
以下、VB6で試したコードです。
コード:
Private Const A = &H0
Private Const B = &H2
Private Const C = &H4
Private Const D = (A Or B Or C)

Private Const E = True
Private Const F = (A Or B Or C Or D Or E)

Private Const G = D + &H1
Private Const H = F + &H1

Public Sub Main()
    Debug.Print "D = " & D
    Debug.Print "F = " & F
    Debug.Print "G = " & G
    Debug.Print "H = " & H
End Sub


以下は上記の出力です。

D = 6
F = -1
G = 7
H = 0
1

スキルアップ/キャリアアップ(JOB@IT)