- PR -

C#でWin32APIを使ってPCM(WAVE)を再生するには?

投稿者投稿内容
MASA
会議室デビュー日: 2006/08/15
投稿数: 4
投稿日時: 2006-08-15 14:19
C#初心者です。C#でWAVEを使いたいと、プログラム例を探していたらここにたどり
着きました。今使っている環境は.NET2003なのですが、このソースを実行させるためには、

(1)Win32API関数の宣言
(2)構造体の宣言
(3)外部シンボル等の定義

が必要かと思います。実際に以下で示す方法でトライしてみているのですが、(2)の
wavehdr_tag.lpNextの型をどうしたらよいか、(3)のHWAVEOUT__はどの型にしたら
よいか分かりません。識者の方にアドバイスいただけたらと思います。



(1)Win32API関数の宣言

[DllImport("winmm.dll")]
public static extern int waveOutOpen(ref IntPtr phwi,
uint uDeviceID, WAVEFORMATEX pwfx, IntPtr dwCallback,
uint dwInstance, uint fdwOpen) ;

[DllImport("winmm.dll")]
public static extern int waveOutPrepareHeader(IntPtr hwo,
WAVEHDR pwh, unit cbwh);

 waveOutWrite,waveOutCloseは略



(2)構造体WAVEFORMATEX,wavehdr_tagの宣言

[StructLayout(LayoutKind.Sequential)]
public struct WAVEFORMATEX
{
public ushort wFormatTag;
public ushort nChannels;
public uint nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
}

[StructLayout(LayoutKind.Sequential)]
public struct wavehdr_tag
{
public System.Text.StringBuilder lpData;
public uint dwBufferLength;
public uint dwBytesRecorded;
public uint dwUser;
public uint dwFlags;
public uint dwLoops;
public 不明 *lpNext;
public uint reserved;
}


(参考 c++のヘッダーでは)
typedef struct WAVEFORMATEX
{
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
};
typedef struct wavehdr_tag
{
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct wavehdr_tag *lpNext;
DWORD reserved;
};



(3)HWAVEOUT__

HWAVEOUT__はuintで代用か??

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