Transcript 音飛び

タイムスタンプ付ストリーム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