ファイルのストリーム読み込みを作ってみました。 大きなファイルの必要な部分だけを読み込むことができます。 読み込みバッファには第17回目で作ったリングバッファを使用しています。 読み込みにはスレッドを使用してメインスレッドとは非同期でファイルを読み込みします。 また複数のファイルを同時に読み込むことができます。 そのためBGM演奏中にファイルを読み込むと言った事が可能になります。 WindowsやMacOSXの場合は何もしなくてもOS側で同等のことができるようになっているため必要ない機能かもしれません(笑)
ソースファイルは Windows版はVisualStudio.NET2003用でWin32アプリケーションプロジェクト。 MacOSX版は作り方がわかりません・・・。誰か教えて・・・。
フルキーの1,2,3でファイルの読み込み開始。 4,5,6で1,2,3に対応したファイルの読み込み停止。
Streamクラスはstandard.h、ringbuffer.cpp/hpp、stream.cpp/hppの5つのファイルから構成されています。 ringbufferは前回作ったものではメモリが足りなくなることが多かったのでnewの変わりにVirtualAllocを使用しました。(Windows専用)
クラスの初期化。CD/DVD-ROMの時はminimumreadsizeを2048の倍数に設定すると効率が良くなる(かも)。
クラスリリース
読み込みファイルを開く
ファイルをクローズ
読み込み開始
読み込み停止
ファイル位置設定
ファイル位置取得
ステータス取得
Stream::STATUS_READY | 準備完了 |
Stream::STATUS_END | 読み込み終了(ファイルの終わりに来た) |
Stream::STATUS_BUSY | 読み込み中 |
Stream::STATUS_STOP | 読み込み停止中 |
Stream::STATUS_ERROR | エラー発生 |
読み込み可能なバッファのサイズを取得
バッファ読み込み
1.binをただ読み込むだけのプログラム。 VisualStudio.NET2003だとこんな感じ。 サンプルプログラムとは関係ありません。
#include <windows.h> #include "standard.h" #include "stream.hpp" int _tmain(int argc, _TCHAR* argv[]) { Stream stream; int32_t handle; stream.Create(1, 1024 * 16, 1, 1024 * 16); handle = stream.Open(_T("1.bin")); stream.Start(handle); while(1) { size_t readablesize; readablesize = stream.GetReadableSize(handle); if(readablesize) { char* buffer; buffer = new char[readablesize]; stream.Read(buffer, readablesize, handle); // bufferにreadablesizeバイトのデータが入る // ここでbufferに読み込まれたデータを処理する delete [] buffer; } if(stream.GetStatus(handle) == Stream::STATUS_END) { break; } } stream.Release(); return 0; }
(Windows版)
(MacOSX版)
なし
(Windows版)
(MacOSX版)
なし
前に戻る?