日記
2009年10月10日
Orpheus 用再生ソフト(Core Audio APIs を用いて(2))
malloc で確保した memory に1曲全部取り込む方法で、
演奏時間が約10分の、比較的大きいファイル(312MB)を
再生させてみました。
ファイルの中身はこんな感じです;
% /usr/local/bin/afinfo ~/ZlinnWAVE/Disk01/04-SymphonyNo39inEflatmajorK543-IAdagio-Allegro.wav
File: ~/ZlinnWAVE/Disk01/04-SymphonyNo39inEflatmajorK543-IAdagio-Allegro.wav
File type ID: WAVE
Data format: 2 ch, 88200 Hz, 'lpcm' (0x0000000C) 24-bit little-endian signed integer
no channel layout.
estimated duration: 590.363 sec ← 演奏時間
audio bytes: 312420240 ← ファイルサイズ(除くヘッダ部分)
audio packets: 52070040
bit rate: 4233600 bits per second
packet size upper bound: 6
audio data file offset: 44
optimized
***
このファイルを再生すると;
% ./AudioFilePlayWithMalloc
fileFormat.mSampleRate = 88200.0 ← サンプル周波数
fileFormat.mBytesPerPacket = 6
fileFormat.mFramesPerPacket = 1
fileFormat.mBytesPerFrame = 6
fileFormat.mChannelsPerFrame = 2 ← 2チャンネルステレオ
fileFormat.mBitsPerChannel = 24 ← 24-bit データ
bufferLength for malloc = 416560320 ← malloc で確保したメモリサイズ
# 312,420,240 (audio bytes) x (4/3) = 416,560,320 (bufferLength) になっています。
24-bit を、float にして malloc しているので。

再生中の memory の動きです。

これは、disk i/o です。launchctl をあまりしていないので、冒頭部分以外
でも、i/o が発生しています。
別の回の測定ですが、
% date;smartctl -a /dev/disk0|grep Start_Stop_Count
に対して、例えば;
Sat Oct 10 11:07:10 JST 2009
4 Start_Stop_Count 0x0032 092 092 020 Old_age Always - 9188
Sat Oct 10 11:17:14 JST 2009
4 Start_Stop_Count 0x0032 092 092 020 Old_age Always - 9191
と、約10分の再生中に、disksleep (= spin down) が、3回発生していますね。
(一旦、disksleep したが、途中で2回目が覚めた。)