バイナリデータをポインタで渡す方法

投稿者: 投稿日:2017/10/07(Sat) 15:29:14 No.1932

 こんにちは、お世話になります。

 「bass.dll」というDLLを使って、素材リストからメモリにファイルを読み込んで、ファイルを再生できないかと考えています。
 それで、下記のようなソースを書いたんですが、うまく動かないようです。
 BASSのエラーコードを取得したところ、41が返ってきてるので、読み込んだデータがおかしいのかもしれないんですが、どうしたらいいかわかりません。
 何か対処法があれば、教えていただけないでしょうか。
 以下、長くなりますが、ソースです。

--------------------

「C:\Windows\media\tada.wav」を素材として利用する

バスを0で初期化する
ストリーム番号は、「tada.wav」でメモリから読み込み
ストリーム番号を表示
[ストリーム番号]をストリーム再生
3秒待つ
[ストリーム番号]を開放
バスを開放する
終了


バスを[ハンドル]で初期化する手順:真偽値
バスは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_Init」)を作る
バスの戻り値型は、真偽値
バスの引数型一覧は、{整数, 整数, 整数, 整数, 整数}
バスを{-1, 44100, 0, [ハンドル], 0}で呼び出して結果とする
結果を返す
終わり

[ファイル名]で〈【ストリームフラグ】として〉メモリから読み込みの手順:整数
もしストリームフラグが無なら
ストリームフラグは、0
もし終わり
ストリームは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_StreamCreateFile」)を作る
ストリームの戻り値型は、整数
ストリームの引数型一覧は、{真偽値, 文字列, 長整数, 長整数, 「System.UInt32」}
音声内容は、素材リストから「tada.wav」を文字列として取得したもの
ファイルサイズは、音声内容のバイト数
audio=ネイティブ参照(型文字列, 内容[音声内容])を作る
ストリームを{○, audio, 0, [ファイルサイズ], [ストリームフラグ]}で呼び出してストリーム番号とする
エラーコード取得
ストリーム番号を返す
終わり

[ストリーム番号]を〈【ストリーム再生フラグ】で〉ストリーム再生の手順:整数
もしストリーム再生フラグが無なら
ストリーム再生フラグは、○
もし終わり
ストリームは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_ChannelPlay」)を作る
ストリームの戻り値型は、整数
ストリームの引数型一覧は、{整数, 真偽値}
ストリームを{[ストリーム番号], [ストリーム再生フラグ]}で呼び出して結果とする
結果を返す
終わり

[ストリーム番号]を開放の手順:真偽値
ストリームは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_StreamFree」)を作る
ストリームの戻り値型は、真偽値
ストリームの引数型一覧は、{整数}
ストリームを{ストリーム番号}で呼び出して結果とする
結果を返す
終わり

バスを開放する手順:真偽値
ストリームは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_Free」)を作る
ストリームの戻り値型は、真偽値
ストリームの引数型一覧は、{}
ストリームを{}で呼び出して結果とする
結果を返す
終わり

エラーコード取得の手順:整数
ストリームは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_ErrorGetCode」)を作る
ストリームの戻り値型は、整数
ストリームの引数型一覧は、{}
ストリームを{}で呼び出してエラーコードとする
エラーコードを表示
エラーコードを返す
終わり

--------------------

 以上、よろしくお願いいたします。

Re: バイナリデータをポインタで渡す方法

投稿者:ゆうと 投稿日:2018/01/25(Thu) 13:25:47 No.1969

こんにちは ゆうとです。
お返事遅くなりました。

バイナリデータについては、バイナリデータ型のオブジェクトを
ネイティブ関数の「呼び出す」手順の引数にそのまま指定してください。
自動的に、バイナリデータの内容をネイティブ関数用のメモリ領域へコピーして
そのポインタが関数に渡されるようになっています。

添付されていたプログラムでは、まず「素材リストからバイナリ配列として取得」するようにします。(文字列では文字コードの変換が行われるために内容が破損します)
また引数一覧のデータ型には文字列ではなくバイナリデータ型を指定します。それに伴って「バイト数」手順ではなく「長さ」設定項目に変えています。
バイナリデータを引数に指定すると、自動的にポインタが渡されますので、「ネイティブ参照」は必要ありません。(ネイティブ参照を使うと、ポインタのポインタになってしまいます)

修正したプログラムを添付します。最新版1.5.881でお試しください。

--------------------
[ファイル名]で〈【ストリームフラグ】として〉メモリから読み込みの手順:整数
  もしストリームフラグが無なら
    ストリームフラグは、0
  もし終わり
  ストリームは、ネイティブ関数(ファイル名「bass.dll」,関数名「BASS_StreamCreateFile」)を作る
  ストリームの戻り値型は、整数
  ストリームの引数型一覧は、{真偽値, バイナリデータ, 長整数, 長整数, 「System.UInt32」}
  音声内容は、素材リストから「tada.wav」をバイナリ配列として取得したもの
  ファイルサイズは、音声内容の長さ
  //audio=ネイティブ参照(型バイナリデータ, 値[音声内容])を作る
  ストリームを{○, 音声内容, 0, ファイルサイズ, ストリームフラグ}で呼び出してストリーム番号とする
  エラーコード取得
  ストリーム番号を返す
終わり
--------------------

Re^2: バイナリデータをポインタで渡す方法

投稿者: 投稿日:2018/01/27(Sat) 16:11:10 No.1974

 こんにちは、お世話になります。

 対応ありがとうございました。
 うまく動きました。

 今後ともよろしくお願いいたします。

▲ページの先頭へ

- WebForum -