読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

8bit22kHzモノラルなwav

PSPSDKには便利なコールバックがあって、テキトーに関数を登録すると勝手にスレッドが回って?適切なタイミングでサウンドバッファ?に波形データを書き込んでくれるみたいなのですが、このサウンドバッファの仕様が16bit44kHzステレオ用らしくて、BGMはそのまま書き込んでやればいいのですが効果音が8bit22kHzモノラルなwavなため良い感じに変換して書き込んでやる必要があると思ったんです。
しかしこの変換の仕方が分からないのです。

// void *bufに書き込むサウンドバッファのポインタ、unsigned long sizeに書き込みサイズが来る 。
// sizeは16bitステレオなんで、size * 2 * 2バイト書き込んでやればよい
// 16bit44kHzステレオ
for (int i = 0; i < size; ++i) {
  fin.read(static_cast<char *>(buf), 4);
}
// 8bit22kHzモノラル
// 左と右に分けた構造体の導入
struct sound_data {
  uint16_t l_;
  uint16_t r_;
};
sound_data *s_buf = reinterpret_cast<sound_data *>(buf); 
for (int i = 0; i < size / 2; ++i) {
  uint8_t temp;
  fin.read(reinterpret_cast<char *>(temp), 1);
  // 8bitを16bitに直すには単純に256倍すればいいと思ったのだが・・・
  temp *= 256;
  s_buf[i * 2].l_ = temp;
  s_buf[i * 2].r_ = temp;
  // 22kHzを44kHzに直すには同じデータで2フレーム埋めればいいと思ったのだが・・・
  s_buf[i * 2 + 1].l_ = temp;
  s_buf[i * 2 + 1].r_ = temp;
}

こんなテキトーに書いた実装ではバリバリノイズが入ります。誰か正しい書き込み方法教えてください(丸投げ)。DXライブラリポータブルのソースあたりでも読んでみますかね。