SDLでWavの再生 改

アバター
馬場自由
記事: 15
登録日時: 12年前

SDLでWavの再生 改

投稿記事 by 馬場自由 » 12年前

Wavデータをメモリに読み込んでから再生する方法がわかったのでメモ。

ストリーミング再生ではないので、Wavファイルのサイズ分だけメモリを消費します。
想定してる用途としては、暗号化したWavファイルを復号化して再生すること。
確認コードはこんな感じになりました。

CODE:

/*-------------------------------------------------------------------
  Wavファイルを読み込んで再生
-------------------------------------------------------------------*/
char CSound::LoadFile(const char *file_name) {
  // ファイルを開いてサイズを調べる
  Fp = fopen(file_name,"rb");
  fseek( Fp, 0, SEEK_END );
  long size = ftell(Fp);
  int wav_size = size - WAV_HEADER_SIZE;
  fseek(Fp, WAV_HEADER_SIZE, SEEK_SET);

  // バッファにデータを読み込む
  Data = new char[wav_size];
  if( ! Data ) {
    printf("failed allocate\n");
    return FAILED_LOAD_SOUND;
  }
  fread(Data, 1, wav_size, Fp);

  // データを転送
  Music = Mix_QuickLoad_RAW((Uint8*)Data, wav_size);
  fclose(Fp);
  
  // 読み込めてるか確認
  if( Music == NULL ) {
    printf("cannot load %s", file_name);
    return FAILED_LOAD_SOUND;
  }
  return SOUND_OK;
}

/*-------------------------------------------------------------------
  音楽の再生
-------------------------------------------------------------------*/
// 空いてるチャンネルを利用する
char CSound::Play(int repeat) {
  if( Mix_PlayChannel(-1, Music, repeat)  == -1 ) { 
    printf("cannot play sound");
    return FAILED_PLAY_SOUND;
  }
  return SOUND_OK;
}

#include 
int main(int argc, char *argv[]) { 
  CSound s;

  s.LoadFile("Op.wav");
  s.Play(-1);// -1:無限再生

  Sleep(5000);
  return 0;
}
Wav先頭から再生するとノイズが乗るので、ヘッダ領域を飛ばして、音声領域の先頭ポインタを
SDLに与えてみたところ、正常に再生されました。

ポーリング処理を追加すれば、復号化しながらストリーミング再生ってのもできるだろうけど、
ポーリングと同時に復号化処理もやっちゃうと重くなりそうなので実装するかは悩みどころ。
そもそも、スクリプト類と違って、本来音楽ファイルは暗号化する意味あまりないんですよねぇ。
極論言えば、音楽鳴らなくてもゲームになるし。

だけど、動画サイトに音楽抜かれてアップされてる現状見てると、
何らかのプロテクト処置が必要かなぁ、と思ったのです。
音楽はそれ一つが”ゲーム音楽”という1作品として完結できるし、それを頒布する時に
「ゲームからWav抜けばいいから要らないわ」って反応されたらやだなぁ、って(w
そんなエゴの為のコードが今回のエントリだったりします。

市販のゲームは音楽にプロテクト処理されてるものってあまり無いですね。
僕は過去に、プレステソフトをコンポでCD再生したことが何度もありますが、
そのまま音楽聞けるソフトが大半(物によっては「CD再生するな」という警告音声が聞けるものも!)でした。
こういう遊び心大好きです(w
いいなぁこういう裏技的なものどっかに仕込みたい。。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

RE: SDLでWavの再生 改

投稿記事 by h2so5 » 12年前

馬場自由 さんが書きました: 僕は過去に、プレステソフトをコンポでCD再生したことが何度もありますが、
そのまま音楽聞けるソフトが大半(物によっては「CD再生するな」という警告音声が聞けるものも!)でした。
こういう遊び心大好きです(w
それ遊びごころじゃなくてマジメな警告だと思いますが^^;

個人的にはこういう一種のDRMには懐疑的です。
需要は確かにあるんでしょうけども、デジタルデータの利点の一つって無制限にコピーできることなので、
それを潰してしまうというのは何か本末転倒な気もします。
かと言って今更レコード使うわけにもいかないんですけど...

表示している間はメモリに残ってしまう画像データと比べると、
音声データはプロテクトしやすいかもしれないですね。

アバター
馬場自由
記事: 15
登録日時: 12年前

Re: SDLでWavの再生 改

投稿記事 by 馬場自由 » 12年前

警告音声は当時の声優が悪ノリしてる所を聞ける貴重なアソビだったのです。
開発者が意図しない操作をすればバグや裏技を見つけられたので、自然と色々ありえんことをやるクセが・・・(w

DRMみたいなのはあって然りだと僕は思ってます。
無制限にコピーできるからこそ、改変された情報があたかも原本かのように巡るので、
物理的・権利的保護が必要なんだと思います。(これは社会構造的な方を先に正すべきなのかも?)

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: SDLでWavの再生 改

投稿記事 by h2so5 » 12年前

馬場自由 さんが書きました:警告音声は当時の声優が悪ノリしてる所を聞ける貴重なアソビだったのです。
開発者が意図しない操作をすればバグや裏技を見つけられたので、自然と色々ありえんことをやるクセが・・・(w
なるほど。
Wikipediaを見ていたらGD-ROMというのを見つけたんですがそういったものなんでしょうか。
馬場自由 さんが書きました: DRMみたいなのはあって然りだと僕は思ってます。
無制限にコピーできるからこそ、改変された情報があたかも原本かのように巡るので、
物理的・権利的保護が必要なんだと思います。(これは社会構造的な方を先に正すべきなのかも?)
僕が言っているのは物理的というより、ソフトウェア的なプロテクトについてです。
あとは社会的道義というよりは技術的な観点からの話です。

現在のDRMは復号に必要な情報がクライアント側に存在するという性質上、原理的に解除ができてしまうわけです。解除するまでに必要な時間が十分長ければ意味がありますが、実際はそこまで強固ではありません。

つまり現在の技術で原理的にできないものを無理にやろうとしているわけです。
そして新しくプロテクト技術を作ったりクラックされたりというイタチごっこは何度も繰り返されていますが、外野から見るとアホ臭く思えてしまうと。

鍵配送問題を解決した公開鍵暗号法のようなブレークスルーがないとDRMは完成しないと思いますね。
最後に編集したユーザー h2so5 on 2013年1月12日(土) 09:48 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: SDLでWavの再生 改

投稿記事 by ISLe » 12年前

ハード性能が低くCDのほうが音質が良かった時代にCD-DAが使われていました。
いまはデジタルデータを読み込みながら再生する余裕があってCDより高品質で出力できますからね。

CD-DAだと垂れ流すしかできないですけど、データなら加工しながら再生もできますし。
ゲーム音楽だとデータバラバラにしてサウンドテストとか作らないようにする程度で良いと思いますけどね。
音楽だけ売りたきゃ音源を豪華にするとか変化を持たせればいいわけです。
ぶっこ抜きで満足するユーザーを勘定に入れるのは皮算用というより他にないと思います。

ちなみに、「CD再生するな」の警告音声は、CD規格に完全対応していない機器だとプログラムデータの入ったトラックを音楽再生してしまうことがあるので、スピーカや人体(主に耳)に甚大な被害を与えることを防ぐためのものです。
最後に編集したユーザー ISLe on 2013年1月12日(土) 17:36 [ 編集 1 回目 ]