- - PR -
C#でWin32APIを使ってPCM(WAVE)を再生するには?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-03-11 06:46
はじめまして。
最近C#勉強し始めたばかりの初心者です。 C#でWin32APIを使い音を鳴らしたいと思って Interop Declarations for Windows.h を使い、色々調べて、自分なりにコードを書いてみたのですが、 コンパイルが通り実行できるものの、肝心の音が鳴りません。 粘ってみたのですが、どうしても分からないので投稿させていただきました。 どんな細かいことでもアドバイスいただけるとありがたいです。 以下に見苦しいですがコードを載せます。よろしくお願いします。
| ||||
|
投稿日時: 2006-03-11 08:52
C# 読んでる気が全くしないコードですね……
.NET では変な値を渡したりした場合、大抵は例外を投げますが、Win32API みたいなのでは、関数の失敗は返値で表します。 waveOut 系の関数の場合は返値から失敗の原因を文字列化する waveOutGetErrorText 関数がありますから、MMSYSERR_NOERROR = 0 以外が返ってきている関数の返値にこれを使って原因を探してください。 | ||||
|
投稿日時: 2006-03-11 10:03
おはようございます。
Hongliangさんアドバイスありがとうございます。 早速waveOut系の返値を全て確認してみたのですが、0でした。 おっしゃる通り、全くC#っぽく無いです…。 結構検索してみたのですが、C#の記事はやはり少なく、その中でもwaveOut系のがほとんど無かったため、C++の記事を参考にして作りました。 あと、補足ですが、使用したInterop Declarations for Windows.h はDllImportの第一引数(リンク設定?)が初期状態で全て@"..¥dll¥user32.dll"のようになっていて使えなかったので、全て@"user32.dll"のように書き換えました。 | ||||
|
投稿日時: 2006-03-11 10:24
あれ、成功してました? お使いの PC にサウンドデバイスは 2 つ以上付けていますか? そうでなければ失敗するコードのはずですが。 > windows.waveOutOpen(&hWOut, 0x0001, &wf, 0, 0, 0x0000); | ||||
|
投稿日時: 2006-03-11 10:33
そもそも、Managed DirectX - DirectSound じゃダメなんですかね? (>_<) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-03-11 10:50
Hongliangさんありがとうございます!!
サウンドデバイス2つあったことをすっかり忘れていました。 デバイス替えたら無事音が鳴りました。 ついでに、指摘してくださったWAVE_MAPPERの値0x0001を0x0000に替えたら、デバイス替えなくても音が鳴りました。ライブラリのヘッダファイルはしっかり確認しないと駄目だと痛感しました。ありがとうございました。 ---- じゃんぬさん、アドバイスありがとうございます。 DirectSoundも気になるのですが、wave関連以外でもWin32APIを使いこなせるようになりたいと思い、その取っ掛かりとして音を鳴らそうとしてみました。まだ文法すらままならないので、文法と並行してやっていこうと思ってます。 | ||||
|
投稿日時: 2006-03-11 11:10
ていうか MSDN にクラス化してるのが載ってますな。
0 だと定数 WAVE_MAPPER とは関係なく 1 番目のデバイスを見に行くだけのような。 Win32API を使いこなすためは良いですけど、もうちょっと C# に歩み寄ったコードの方が良いと思います。先の MSDN のを参考にしてみてください。 // あれもまあ微妙なところもありますけど。 | ||||
|
投稿日時: 2006-03-11 11:50
Hongliangさん、たびたびすいません。
クラス便利そうですね。参考にします。ありがとうございます。
色々サンプルなどを見てがんばっていきたいです。 今まで文法書などを見ているだけだったので、これからはもっとコードを書いていこうと思います。やっぱ読むのと書くのじゃ全然違いますね…。 |