HSPからBASS audio libraryを使いたいんじゃ。3

今回は。

ラッパーDLLはもう少し後にして、CUIの簡単なプレーヤーを作ってみようかと思います。

マニュアルやサンプルを見て使い方を考えなくちゃ。めんどい。

頼みの綱


再生までのおおまかな流れは、

  1. デバイスを開く BASS一個につき一個

  2. ファイルを読み込む 固有のIDが返ってくる

  3. IDを指定して様々な操作をする

的な感じかもしれませんよ。

もう少しはっきり言え

初期化のタイミングでデバイスを開く

BASS_Stream***関数でHSTREAM型の識別子を取得。
この型で参照するものはチャンネルと呼ばれるらしい。
ほかにもHCHANNEL、HMUSICなどのチャンネルもあるらしい。

BASS_Channel***関数でチャンネルに何かしらの操作をする。

「チャネル」は、サンプル再生チャネル(HCHANNEL)、サンプルストリーム(HSTREAM)、MOD音楽(HMUSIC)、または録音(HRECORD)の場合があります。各「チャンネル」機能は、これらのチャンネルタイプの1つまたは複数で使用できます。

http://www.un4seen.com/doc/#bass/channel.html からgoogle翻訳

準備・解放

//初期化処理
if (!BASS_Init(-1, 44100, 0, 0, NULL)) {
	Error("Can't initialize device");
	return 0;
}

//終了処理
BASS_Free();
BOOL BASS_Init(
    int device,
    DWORD freq,
    DWORD flags,
    HWND win,
    void * clsid
);

device:使用するデバイス
-1でその機器のデフォルトの物。
0は"no sound"とのこと。なんでそんな選択肢が用意されているのだろう?
1~は見つかったすべてのデバイスが対応しているという事なんだろう。

freq:サンプルレート
そのデバイスのプロパティ画面で設定された周波数以外を指定したらどうなるんだろうか。
それで開けるものなのか。知らん。

flags:フラグ
初期化に際していろいろな設定ができるみたい。取り敢えず0にしとけばええ感じにしてくれるんやろどうせ。

win:ウィンドウハンドル
コンソールアプリケーションの場合は0で良らしいです。

clsid:未使用、NULLにしとけばいいみたい。


ストリームを開く

HSTREAM str = BASS_StreamCreateFile(FALSE, filename, 0, 0, 0);
if (!str)
	Error("Can't stream the file");
HSTREAM BASS_StreamCreateFile(
    BOOL mem,
    void *file,
    QWORD offset,
    QWORD length,
    DWORD flags
);

mem
trueならメモリ上のデータを再生 falseならファイルから再生

file(mem=true)
再生するデータの先頭メモリアドレス
メモリからストリーミング再生する。

file(mem=false)
ファイル名の先頭アドレス
サンプルではLPTSTRを渡していたので、UNICODEじゃないコンソールならchar*でいいんだよな?

offset・length
mem=falseの時のみ使用
lengthは0指定でファイルの最後まで。

flags
フラグらぜ。いっぱいあるけどとりあえず0で動くんらぜ。
詳しくはドキュメントみるのぜ。

関数は成功すればストリームのハンドルが、失敗すれば0が返される。

再生

if (!BASS_ChannelPlay(str, FALSE))
	Error("Can't play stream");

第二引数がtrueなら最初から再生。

停止

BASS_ChannelStop(str);

ストリームを開放する

BASS_StreamFree(str);

簡単なプレーヤーを作ってみるで


#include <stdio.h>
#include "bass.h"


int main () {
	//初期化処理
	if (!BASS_Init(-1, 44100, 0, 0, NULL)) {
		printf("あかん、動かん。");
		return 0;
	}
	
	char path[256];
	int endflag = 1;
	HSTREAM str;
	
	while (endflag)
	{
		printf("ファイルパス入力してけろ。");
		if (scanf("%255[^\n]%*[^\n]", path) < 1) *path = '\0';
		
		str = BASS_StreamCreateFile(FALSE, path, 0, 0, 0);	//ストリームを開く
		if (!str) {
			printf("ファイルを開けないドン。");
			switch(BASS_ErrorGetCode())
			{
				//エラーメッセージとか
			}
		}else{
			printf("再生するドン!");
			if (!BASS_ChannelPlay(str, FALSE))
			{
				printf("再生できない(;o;)");
				switch(BASS_ErrorGetCode())
				{
					//エラーメッセージとか
				}
			}
		}
		
		printf("続ける場合は0、終了する場合は0以外を入力するドンドンミヨドン");
		scanf("%d%*[^\n]",&endflag);
		getchar();	//ここに空読み入れたらうまくいったけどんにゃぴ・・・
		
		BASS_StreamFree(str);	//再生中だったものを解放
	}
	
	
	//終了処理
	printf("ばいなら");
	BASS_Free();
	return 0;
}

ベターっと書いたけどうごくにゃ。にゃ。
バグまみれかもしれないので、このコードについて何の責任も負いませんよ。

にゃ

中々感動ものだよ。cでメディアプレイヤーが作れる。

次回、こいつはようやくラッパーDLLに着手するのか!?するのだろうか!???
レッツ?レッツ? …うん、何…?(シャイボーイ)

じゃあね、またね。

この記事が気に入ったらサポートをしてみませんか?