Audio

A-law

A-lawが動くようになりました。 差分 どうもA-lawは最終的に偶数ビットをビット反転しないといけないらしく、それを直せばおおよそ合ってました。 電気回路の都合みたいですが、ファイルフォーマットまで反転する必要もない気がします。 リファレンス実装と…

μ-law

μ-lawエンコーディングに対応しました。 差分 μ-lawというのは要するに「振幅の対数を取れば小さくなるよね」というエンコーディングです。 wikipedia:μ-law algorithm 実装としては、μ-lawと浮動小数点数の変換、μ-lawと32ビット整数の変換の二種類を実装し…

au_file.hpp

SunのAuファイルを扱うSource/Sinkを作りました。 <hamigaki/audio/au_file.hpp> Auファイルのフォーマットは、オーディオデータの前にヘッダが付いただけの簡単なものです。 wikipedia:Sunオーディオファイル ただし、Auフォーマットの標準エンコーディングであるμ-lawにHamigaki.Audio</hamigaki/audio/au_file.hpp>…

/dev/audio対応

pcm_sinkとpcm_sourceを/dev/audioに対応させました。 差分 さすがにpcm_device.cppが大きくなりすぎたので、実装毎にファイルを分けるようにしました。 差分 ついでにpcm_sink/sourceを通さずにアクセスできるように個別のクラスも用意しています。 audio_s…

pulse_audio.hppのドキュメント

pulse_audio.hppのドキュメントを追加しました。 pulse_audio.hppのドキュメント pcm_device.hppのドキュメントをコピペしただけで実質中身がないです。 コンストラクタが全然違うので書き直しました。 あとは、typoとか細かい修正だけです。

pulse_audio_source

Linuxでaction_gameが動くようになったので、残作業を片付けます。 今日はPulseAudioで録音するpulse_audio_sourceも作成しました。 差分 録音は最近真面目にテストしてなかったので、マイク使ったのは久しぶりです。(埃かぶってました!) これを使った録音…

pulse_audio_sink

PulseAudioで再生するpulse_audio_sinkを作りました。 pulse_audio.cpp PulseAudioのヘッダはUNIX系のヘッダに依存しているので、VC++等ではコンパイルできません。 MinGWなら辛うじて動きます。 このため、コンパイラ毎にビルドする/しないをカスタマイズす…

PulseAudio

どっから手を付けてよいやら状態なので、試しにaction_game.exeをGTK+&OpenGLに移植してみることにしました。 で、Hamigaki.Audioに非Windows用のDirectSound代替物がなくていきなり詰まりました。 Linuxのサウンドドライバはいろんなものが乱立していて良く…

続 再生キャンセル

direct_sound_sinkのコンストラクタでバッファをフラッシュするのをやめました。 direct_sound.cppの差分 close()した場合はフラッシュ、close()せずにデストラクタが呼ばれた場合はキャンセルという意味合いです。 さらに、action_gameの再生バッファを調整…

再生キャンセル

action_gameのテストで気が付いたんですが、ジャンプを短時間に繰り返すと、前の効果音の再生を停止してから新しい効果音を再生するため、一瞬ゲームの進行が停止します。 これはデバイスのclose()をしたときに再生バッファに残っているデータがなくなるまで…

効果音

ジャンプ開始時に効果音を付けてみました。 今日の差分 まだ、コルーチン側から効果音を再生できないので再生の条件がテキトーです。(しゃがみジャンプだと音が鳴りません) DirectSoundのバッファにはストリーミングバッファ(ループあり)とスタティックバッ…

libvorbis#300

libvorbisの例のバッファーオーバーランバグが直ったみたいです。 x64で別バグが残ってるみたいでチケットはクローズされてませんけど、直接的には関係ないような気がします。 次のリリースに合わせてHamigaki.Audioのテストケースも更新する予定です。

vorbis_file_sourceのバグ

falcom_playを偶然デバッガから起動したところ、vorbis_file_sourceにメモリ破壊バグがあることに気が付きました。 原因はlibvorbisのov_clear()がfclose()相当のコールバックを呼び出すことで、vorbis_file_sourceのデストラクタがov_clear()が呼ぶときにコ…

Oggのマルチストリーム その3

libogg、libvorbis、ogg123のソースを追った結果、 Oggのグループ化(同時多重化)はライブラリユーザーが手動で行うものらしい eosページが壊れていると、以降のチェインされたストリームが全て無視される シーク不能なデバイスを考慮すると、チェインされた…

RFC 3533

RFC 3533「Ogg カプセル化フォーマット バージョン0」をようやく訳し終わりました。 http://www12.ocn.ne.jp/~dante98/text/rfc3533j.txt 付録とか英語の部分が残ってますが、まぁ分かると思います。 慣習的に、bosページの最初の数バイトは要求されるコーデ…

OSX動作報告

知人からOSX(x86)での動作報告を受けました。 再生/録音ともに動作するそうです。 まさか修正なしで動くとは思いませんでした。 PowerPCでも多分動いていると思います。 テスト済み環境に追加しました。 http://hamigaki.sourceforge.jp/doc/html/requiremen…

Oggのマルチストリーム その2

やっとOggのRFCを半分くらい訳しました。 ストリームの多重化に関しては大体理解できました。 Oggには二種類のストリーム多重化があります。 同時多重化(グループ化) 複数のストリームを交互に混ぜる 逐次多重化(チェイン化) ストリームを単純に連結する Ogg…

Oggのマルチストリーム

昨日のBGMループがおかしかった件で、Ogg Vorbisでループ情報を保存する方法を考えていました。 日本ファルコムやセガのゲームではVorbisコメントにループ情報を書いているんですが、Vorbisコメントはメモの用途に使うもので、メタ情報を埋め込むものではあ…

BGM追加

CoreAudioラッパーの実装もひとまず終わったのでaction_gameの作成に戻りました。 久々にHamigaki.Audioを弄ったことですし、BGMをつけてみました。 今日の差分 BGMを再生しているのはこの部分です。 // メンバ変数 ::HWND handle_; audio::direct_sound_dev…

AudioConverter

pcm_sourceにAudioConverterを組み込んで、サンプリングレートの変換を実装しました。 今日の差分 AUConverterというAudioConverterのラッパーAudioUnitがるので、本当はこれを使いたかったのですが、これを繋ぐと入力コールバックを設定できなくなるので使…

Mac版pcm_source

rresize()のバグで激しくメモリを壊していたので修正しました。 circular_buffer.hppの差分 メモリ破壊の結果、スレッドの管理情報を壊していて、pthread_join()やpthread_cond_wait()がおかしな動きをしていました。 gdbで特定のアドレスが書き換わったらブ…

AudioUnit

昨日はCoreAudioの低レベルAPIであるAudio Hardware Abstraction Layerを使うことを検討していたんですが、 ネイティブエンディアン32ビット浮動小数点数フォーマットしか使えない サンプリングレートを変更するとシステム全体に影響する(っぽい) 入力と出力…

kAudioFormatFlagIsNonInterleaved

CoreAudioを弄って音を出すところまで試しました。(というか出したつもり) SourceForge.jpのコンパイラファームで試しているんですが、リモートからsshでログインしてオーディオデバイスがオープンできてしまいました。 これっていいんでしょうかね。データ…

CoreAudio

Hamigaki.AudioをOSXでも動かせないものかと思ってCoreAudioについて調べてみました。 ざっと見た限り、ASIOのインタフェースに良く似ていて、コールバック関数でバッファを埋める形式のようです。 これならasio_sink/asio_sourceのコードを流用できそうです…

vorbis 1.2.0

vorbis 1.2.0がリリースされていました。(Cygwin ML読んでて気付きました。) 以前報告したバグにも対策が施されていたので、修正を確認してみました。 結果、16/22kHzステレオのエンコードは直っているんですが、モノラルが直っていませんでした。残念。

oggとvorbisのビルド

libpngと同じようにliboggとlibvorbisのビルド用Jamfileも用意しました。 今日の差分 BBv1の頃のようにOGG_SOURCEとVORBIS_SOURCEを定義すればソースからビルドするようになります。 Windowsのvorbis.dllだけvorbisenc.cを含んでいるのがトリッキーです。

Hamigaki.Audio for BBv2

BBv2の解説が途中ですが、S.F.さんからの指摘を受けて先にHamigaki.Audioのビルド手順を改善しました。 http://hamigaki.sourceforge.jp/doc/html/audio/installation.html 結果、設定はこれだけで済むようになりました。 # グローバル変数を設定するため、…

sound_playerの機能追加

予定通り、sound_playerにフォーマット情報を表示する機能を追加しました。 メニューから[File]-[Properties...]を選択すると、次のようなメッセージが表示されます。 container: RIFF encoding: Linear PCM (little-endian) length: 00:00:01 bit rate: 141…

wide_adaptor::seek()

sound_playerのシークが変だと思っていたのは、Playボタンのイベント処理のミスでした。 ボタンのスタイルからBS_NOTIFYを外したら直りました。 さて、ようやく安定して動くようになったので、いくつか機能追加を行いました。 ファイルのドラッグ&ドロップ…

audio::null_sink

今日はsound_playerのクラッシュバグを調査していました。 サウンドの出力先をboost::iostreams::null_sinkに変更するとクラッシュしない background_playerの代わりにboost::iostreams::copy()を使うとクラッシュしない ことから、background_playerのタイ…