//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * ストリームプレーヤヘッダ
 * @author Junpee
 */

#ifndef STREAM_PLAYER_H_
#define STREAM_PLAYER_H_

#include <Core/Thread/Thread.h>

namespace Lamp{

class SoundBuffer;
class SoundReader;

//------------------------------------------------------------------------------
/**
 * ストリームプレーヤ
 */
class StreamPlayer : public Thread{
friend class StreamSound;
friend class StreamSound3D;
protected:
	/**
	 * コンストラクタ
	 */
	StreamPlayer();

	/**
	 * デストラクタ
	 */
	virtual ~StreamPlayer();

	/**
	 * 初期化
	 * @param soundBuffer サウンドバッファ
	 * @param soundReader サウンドリーダ
	 */
	virtual bool initialize(SoundBuffer* soundBuffer, SoundReader* soundReader);

	/**
	 * リセット
	 */
	virtual void reset();

	//--------------------------------------------------------------------------
	/**
	 * 実行
	 * @param thread 実行しているスレッド
	 *
	 * isStopRequested()がtrueを返す場合は速やかに処理を終了させる
	 */
	virtual void run(Thread* thread);

	/**
	 * ストリーム書き込み
	 * @param offset 0ならバッファ前半、1なら後半に書き込む
	 * @return 成功すればtrue
	 */
	virtual bool writeStream(int offset);

	//--------------------------------------------------------------------------
	// 再生位置
	//--------------------------------------------------------------------------
	/**
	 * 再生位置設定
	 * @param cursor 再生位置のバイト数
	 */
	virtual void setCursor(u_int cursor);

	/**
	 * 再生位置取得
	 * @return 再生位置のバイト数
	 */
	virtual u_int getCursor() const{ return cursor_; }

	//--------------------------------------------------------------------------
	// ループ
	//--------------------------------------------------------------------------
	/**
	 * ループ位置の設定
	 * @param loopCursor ループ位置をバイト数で指定
	 */
	virtual void setLoopCursor(u_int loopCursor);

	/**
	 * ループ位置の取得
	 * @return ループ位置のバイト数
	 */
	virtual u_int getLoopCursor() const{ return loopCursor_; }

private:
	//--------------------------------------------------------------------------
	// コピーコンストラクタの隠蔽
	StreamPlayer(const StreamPlayer& copy);

	// 代入コピーの隠蔽
	void operator =(const StreamPlayer& copy);

	// DirectSoundNotify
	DirectSoundNotify* directSoundNotify_;
	// サウンドバッファ
	SoundBuffer* soundBuffer_;
	// サウンドリーダ
	SoundReader* soundReader_;
	// イベント数
	static const int eventCount_ = 3;
	// イベントハンドル
	HANDLE event_[eventCount_];
	// 再生位置
	u_int cursor_;
	// ループ位置
	u_int loopCursor_;
	// 初期化フラグ
	volatile bool initialized_;
};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of STREAM_PLAYER_H_
//------------------------------------------------------------------------------
