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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0423
ゆーサウンド出力デバイスを取得する方法5解決


ゆー

リンク

2018/4/23(Mon) 18:14:51|NO.84109

HSPでサウンド出力デバイスを取得したいです。
調べてみると、waveOutGetDevCaps関数を使えばできるみたいですが、HSPでの使い方が
書いてなく、どう使えばいいのか分かりません。
waveOutGetNumDevs関数の使い方はわかるのですが、waveOutGetDevCaps関数の使い方がわかりません。
どう使えばいいのでしょうか。

#uselib "winmm.dll" #cfunc waveOutGetNumDevs "waveOutGetNumDevs" mes waveOutGetNumDevs()



この記事に返信する


あらや

リンク

2018/4/24(Tue) 00:12:55|NO.84115

構造体に文字列があったり16ビット整数値があったりで
若干面倒ですが、おおざっぱにやるとこんな感じです。

#define WAVE_FORMAT_1M08 1 // 11.025 kHz、モノラル、8ビット #define WAVE_FORMAT_1S08 2 // 11.025 kHz、ステレオ、8ビット #define WAVE_FORMAT_1M16 4 // 11.025 kHz、モノラル、16ビット #define WAVE_FORMAT_1S16 8 // 11.025 kHz、ステレオ、16ビット #define WAVE_FORMAT_2M08 16 // 22.05kHz、モノラル、8ビット #define WAVE_FORMAT_2S08 32 // 22.05kHz、ステレオ、8ビット #define WAVE_FORMAT_2M16 64 // 22.05kHz、モノラル、16ビット #define WAVE_FORMAT_2S16 128 // 22.05kHz、ステレオ、16ビット #define WAVE_FORMAT_4M08 256 // 44.1kHz、モノラル、8ビット #define WAVE_FORMAT_4S08 512 // 44.1kHz、ステレオ、8ビット #define WAVE_FORMAT_4M16 1024 // 44.1kHz、モノラル、16ビット #define WAVE_FORMAT_4S16 2048 // 44.1kHz、ステレオ、16ビット #define WAVE_FORMAT_48M08 0x00001000 // 48kHz、モノラル、8ビット #define WAVE_FORMAT_48M16 0x00002000 // 48kHz、モノラル、16ビット #define WAVE_FORMAT_48S08 0x00004000 // 48kHz、ステレオ、8ビット #define WAVE_FORMAT_48S16 0x00008000 // 48kHz、ステレオ、16ビット #define WAVE_FORMAT_96M08 0x00010000 // 96kHz、モノラル、8ビット #define WAVE_FORMAT_96M16 0x00020000 // 96kHz、モノラル、16ビット #define WAVE_FORMAT_96S08 0x00040000 // 96kHz、ステレオ、8ビット #define WAVE_FORMAT_96S16 0x00080000 // 96kHz、ステレオ、16ビット #define WAVECAPS_PITCH 1 // ピッチコントロールをサポートしている #define WAVECAPS_PLAYBACKRATE 2 // 再生速度制御をサポートしている #define WAVECAPS_VOLUME 4 // ボリュームコントロールをサポートしている #define WAVECAPS_LRVOLUME 8 // 独立した左右のボリュームコントロールをサポートしている #define WAVECAPS_SYNC 16 // ドライバは同期しており、バッファの再生中はブロックされる #define WAVECAPS_SAMPLEACCURATE 32 // サンプル正確な位置情報を返す #define WAVECAPS_DIRECTSOUND 64 // Directサウンドをサポートしている?(資料不足) #uselib "winmm.dll" #cfunc waveOutGetNumDevs "waveOutGetNumDevs" #func waveOutGetDevCaps "waveOutGetDevCapsA" int, sptr, int screen 0, 900, 600, 0; devnum = waveOutGetNumDevs(); dim WAVEOUTCAPS, 13; // WAVEOUTCAPS構造体 sdim szPname, 32; // 製品名(32byteまでしか取得できない?) ;waveOutGetDevCaps -1, varptr(WAVEOUTCAPS), 13*4; // 第1引数の -1 はデフォルトデバイスを意味する waveOutGetDevCaps 0, varptr(WAVEOUTCAPS), 13*4; // 第1引数は -1 と 0 〜 devnum-1 までの数値が指定可能 // ―――――――――――――――――――――――――― // ―――――――――― // ――― 取得したWAVEOUTCAPS構造体の情報を整理 // ― wMid = WAVEOUTCAPS(0) & 0xFFFF; wPid = (WAVEOUTCAPS(0)>>16) & 0xFFFF; vDriverVersion = WAVEOUTCAPS(1); // 数値を文字列へ変換 repeat 8 poke szPname, cnt*4, WAVEOUTCAPS(2+cnt) & 0xFF; poke szPname, cnt*4+1, (WAVEOUTCAPS(2+cnt)>>8) & 0xFF; poke szPname, cnt*4+2, (WAVEOUTCAPS(2+cnt)>>16) & 0xFF; poke szPname, cnt*4+3, (WAVEOUTCAPS(2+cnt)>>24) & 0xFF; loop dwFormats = WAVEOUTCAPS(10); wChannels = WAVEOUTCAPS(11) & 0xFFFF; wReserved1 = (WAVEOUTCAPS(11)>>16) & 0xFFFF; dwSupport = WAVEOUTCAPS(12); // ―――――――――――――――――――――――――― // ―――――――――― // ――― 各種情報の表示 // ― mes "機器のメーカー識別子\t\t\t"+wMid; mes "機器の製品識別子\t\t\t"+wPid; mes "機器のバージョン番号\t\t\t"+vDriverVersion; mes "製品名(半角32文字まで)\t\t"+szPname; mes "サポートされる標準のフォーマット\t"+dwFormats+"(詳細はウィンドウ左下)"; mes "オーディオのチャンネルの数\t\t"+wChannels; mes "予約済み(現状無意味)\t\t\t"+wReserved1; mes "オプションの機能\t\t\t"+dwSupport+"(詳細はウィンドウ右下)\n\n"; y = ginfo_cy; mes "サポートされる標準のフォーマット 詳細\n"; if( dwFormats & WAVE_FORMAT_1M08 ):mes "11.025kHz\tモノラル\t8ビット"; if( dwFormats & WAVE_FORMAT_1S08 ):mes "11.025kHz\tステレオ\t8ビット"; if( dwFormats & WAVE_FORMAT_1M16 ):mes "11.025kHz\tモノラル\t16ビット"; if( dwFormats & WAVE_FORMAT_1S16 ):mes "11.025kHz\tステレオ\t16ビット"; if( dwFormats & WAVE_FORMAT_2M08 ):mes "22.05kHz\tモノラル\t8ビット"; if( dwFormats & WAVE_FORMAT_2S08 ):mes "22.05kHz\tステレオ\t8ビット"; if( dwFormats & WAVE_FORMAT_2M16 ):mes "22.05kHz\tモノラル\t16ビット"; if( dwFormats & WAVE_FORMAT_2S16 ):mes "22.05kHz\tステレオ\t16ビット"; if( dwFormats & WAVE_FORMAT_4M08 ):mes "44.1kHz\t\tモノラル\t8ビット"; if( dwFormats & WAVE_FORMAT_4S08 ):mes "44.1kHz\t\tステレオ\t8ビット"; if( dwFormats & WAVE_FORMAT_4M16 ):mes "44.1kHz\t\tモノラル\t16ビット"; if( dwFormats & WAVE_FORMAT_4S16 ):mes "44.1kHz\t\tステレオ\t16ビット"; if( dwFormats & WAVE_FORMAT_48M08 ):mes "48kHz\t\tモノラル\t8ビット"; if( dwFormats & WAVE_FORMAT_48M16 ):mes "48kHz\t\tステレオ\t16ビット"; if( dwFormats & WAVE_FORMAT_48S08 ):mes "48kHz\t\tステレオ\t8ビット"; if( dwFormats & WAVE_FORMAT_48S16 ):mes "48kHz\t\tステレオ\t16ビット"; if( dwFormats & WAVE_FORMAT_96M08 ):mes "96kHz\t\tモノラル\t8ビット"; if( dwFormats & WAVE_FORMAT_96M16 ):mes "96kHz\t\tモノラル\t16ビット"; if( dwFormats & WAVE_FORMAT_96S08 ):mes "96kHz\t\tステレオ\t8ビット"; if( dwFormats & WAVE_FORMAT_96S16 ):mes "96kHz\t\tステレオ\t16ビット"; pos 450, y; mes "オプションの機能 詳細\n"; if( dwSupport & WAVECAPS_PITCH ):mes "ピッチコントロールをサポートしている"; if( dwSupport & WAVECAPS_PLAYBACKRATE ):mes "再生速度制御をサポートしている"; if( dwSupport & WAVECAPS_VOLUME ):mes "ボリュームコントロールをサポートしている"; if( dwSupport & WAVECAPS_LRVOLUME ):mes "独立した左右のボリュームコントロールをサポートしている"; if( dwSupport & WAVECAPS_SYNC ):mes "ドライバは同期しており、バッファの再生中はブロックされる"; if( dwSupport & WAVECAPS_SAMPLEACCURATE ):mes "サンプル正確な位置情報を返す"; if( dwSupport & WAVECAPS_DIRECTSOUND ):mes "Directサウンドをサポートしている?(資料不足)";

情報全てを表示するためにウィンドウが大きくなってしまったのは申し訳ないです。
mesboxで表示した方が良かったですね。。。



ゆー

リンク

2018/4/27(Fri) 16:38:44|NO.84179

ありがとうございます。
返信遅くなりすみません。
ですが、2つ質問させてください。

製品名は32文字までしか取得できないのですか?
「スピーカー (Realtek High Defini」のところまで、切れてしまいます。

これを使って、サウンド出力デバイスを別々に鳴らす事は可能でしょうか?

よろしくお願いします。



MillkeyStars

リンク

2018/4/28(Sat) 03:42:53|NO.84184

これでいいのかわからないけど、一応。。。(にしてもスクリプトすごいぐちゃぐちゃやん。ごめんなさい)

//オーディオ特定ライン再生 #uselib "winmm.dll" #func waveOutOpen "waveOutOpen" var,int,var,int,int,int #func waveOutPrepareHeader "waveOutPrepareHeader" int,var,int #func waveOutWrite "waveOutWrite" int,var,int #define null 0 WaveFile = dir_exe+"\\hsptv\\se_tyuiin.wav" //【WAVEファイルロード部】 //Waveファイルが存在するかチェック exist WaveFile if strsize == -1{ dialog "Waveファイルが存在しませんでした" stop } else { FileSize = strsize } //Waveファイルの情報構造体を取得 sdim FileData,FileSize bload WaveFile,FileData,FileSize if strsize != FileSize{ dialog "サイズが異常です。停止します。\n読み込まれたサイズ : "+strsize stop } mes "ファイル全体サイズ : "+FileSize+" byte" //データ情報取得 HRIFF = lPeek(FileData,0) if HRIFF != 0x46464952{ dialog "RIFFヘッダを確認できませんでした。" : stop } Offset += 4 OutOfSize = lPeek(FileData,Offset) mes "RIFFヘッダとこのサイズ領域を除くサイズ : "+OutOfSize+" byte" Offset += 4 HWAVE = lPeek(FileData,Offset) if HWAVE != 0x45564157{ dialog "WAVEヘッダを確認できませんでした" : stop } Offset += 4 CFMT = lPeek(FileData,Offset) if CFMT != 0x20746D66{ dialog "FMTチャンクを確認できませんでした" : stop } Offset += 4 CFMT_Size = lPeek(FileData,Offset) mes "FMTチャンクサイズ : "+CFMT_Size+" byte" Offset += 4 //FMTデータ dim CFMT_Data,4 memcpy CFMT_Data,FileData,16,0,20 Offset += 16 //data チャンク検索 Skip = -1 repeat 64 CDATA = lPeek(FileData,Offset + cnt) if CDATA == 0x61746164 : Skip = cnt : break loop if Skip == -1{ dialog "データチャンクを確認できませんでした" : stop } mes "データチャンク場所 : ファイル先頭より "+(Offset + Skip)+" byte" Offset += Skip + 4 //data のサイズ CDATA_Size = lPeek(FileData,Offset) mes "データのサイズ : "+CDATA_Size Offset += 4 //データの実態を作成する dupptr WaveDataMain,varptr(FileData) + Offset,CDATA_Size,2 //【再生デバイス関係】 //どのデバイスで再生したいか。ここを再生デバイスの数だけ変更してみてね。 DeviceID = 0 //フォーマット情報をコピー dim WAVEFORMATEX,5 memcpy WAVEFORMATEX,CFMT_Data,16,0,0 poke WAVEFORMATEX,16,18 //WaveOutOpen HandleWO = 0 waveOutOpen HandleWO,DeviceID,WAVEFORMATEX,null,null,0 if (stat != 0){ dialog "デバイスのオープンに失敗しました。" : stop } //waveOutPrepareHeader【バッファ初期化】 dim WAVEHDR,32 WAVEHDR(0) = varptr(WaveDataMain) WAVEHDR(1) = CDATA_Size waveOutPrepareHeader HandleWO,WAVEHDR,32 if (stat != 0){ dialog "WAVEHDR 初期化に失敗しました。" : stop } waveOutWrite HandleWO,WAVEHDR,32



あらや

リンク

2018/4/28(Sat) 17:08:10|NO.84193

>製品名は32文字までしか取得できないのですか?
>「スピーカー (Realtek High Defini」のところまで、切れてしまいます。
念のためAPIのソース(MMSystem.h)を確認してみました。

#define MAXPNAMELEN 32 〜省略〜 // WAVEOUTCAPS構造体の内部 TCHAR szPname[MAXPNAMELEN];
こんな感じになっていました。

これをHSP的に書くと

#define MAXPNAMELEN 32 sdim szPname, MAXPNAMELEN

となるので名前を入れる変数は32文字分というか

正確には32バイト分しか用意されておらず、

しかも最後(32バイト目)は文字列の終端を示す0を入れる処理がなされるようなので

実際には31バイトまでしか名前が取得できないようです。



これだと、たいていの場合は変な所で途切れますね。



ゆー

リンク

2018/5/2(Wed) 18:23:05|NO.84240

>あらやさん
ありがとうございます。
再び返信が遅れてすみません。
やっぱりwaveOutGetDevCaps関数では無理でしたか。
他のAPIがないか探してみます。
MillkeyStarsさんもありがとうございました。



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