タイムスタンプ付ストリームI/O による音の実時間処理 学籍番号 98-0997-3 栗田 亮 指導教官 千葉 滋 講師 1 音のサンプリングの仕組み サンプリング・・・音をデジタル変換し記録する技術 Linuxカーネルにおける音の録音 サウンドデバイスにアクセスして行う ADC・・・アナログ・デジタル変換器 割り込み・・・カーネルバッファにデジタルデータが格納される read()・・・カーネルバッファからアプリケーションバッファへサウンド データをコピー kernel application buffer アナログデータ buffer ADC 2 音飛び サンプリングでの問題 ー 音飛び 音飛びが生じると・・・一部のデータが抜け落ち、抜け落 ちた分余計に記録してしまう 原因1:割り込み処理の遅れ • 実際に高負荷をかけたが確認されなかった 原因2:アプリケーションの遅れ • カーネルバッファが一杯になり、後からきたデータが破棄されて 失われてしまう • サンプリングと同時に複数のアプリケーションを実行させている と、マシンに負荷がかかり生じる 3 リアルタイムOSによる対処 既存の汎用リアルタイムOS RT-Linux • 割り込み処理を高速化する機能を提供 • 音飛びの問題ではあまり重要ではない • プログラミングが複雑 ART-Linux • 非リアルタイム処理が遅くなる • まだ研究レベル 4 提案するシステム TS-I/O (Time Stamp - I/O) 入出力(I/O)のタイムスタンプを記録するシステム I/Oデータがバッファに正常に格納された始まりの時刻 と終わりの時刻を記録する size=10 時刻 0 4 6 音飛び kernel buffer サウンド データ タイム スタンプ 0..4 6..10 size=8 tsize 10秒 application buffer buf tbuf 5 TS-I/Oの利用 ソフトリアルタイムのI/O処理が可能に ソフトリアルタイム・・・音飛びに対処 音飛びの発生をアプリケーションに通知 メディアストリーム処理では、応答性よりも時間軸に沿っ たI/O管理が重要 • 複数のメディアとの同期 e.g. 自動伴奏、カラオケ I/Oのみなので、システムはシンプル タイムスタンプを元にリカバリー処理が可能 e.g. 無音データを挿入することで実時間に沿った再生が可能 6 追加したシステムコール read_gettbuf(fd,buf,tbuf,size,tsize) read(fd,buf,size)+タイムスタンプの取り出し • tbuf・・・タイムスタンプを格納するバッファ • tsize・・・タイムスタンプのサイズ kernel buffer サウンド データ タイム スタンプ 0..4 6..10 size tsize application buffer buf tbuf 7 TS-I/Oの実装 対象にしたデバイス・ドライバ • Linux2.2.19,linux/drivers/sound/es1371.c • es1371_read()・・・カーネルバッファにたまったサウンドデータ をアプリケーションバッファへコピーする関数 • es1371_interrupt()・・・カーネルバッファにI/Oデータが格納 された際に呼ばれる割り込み処理関数 es1371_interrupt()が呼ばれた時刻を監視し、音飛びのタイムス タンプをカーネルに記録する es1371_read()処理後、アプリケーションにタイムスタンプを渡す es1371_read()で音飛びした分の無音データを挿入できる 8 デモ 音飛びを検出して無音区間を挿入するアプ リケーション 音飛びに対して無音を入れたデータ、音源デー タ、音飛びしてしまったデータの比較 比較方法 • 波形をみる • 実際に聞いてみる 9 まとめ TS-I/Oを提案 LinuxにおけるI/Oレベルでのソフトリアルタイ ム処理を可能にする機能 タイムスタンプを利用した音飛びの通知 課題 出力もTS-I/O 音以外のI/Oデータ (例 動画) に対して TSI/Oを適応 10
© Copyright 2024 ExpyDoc