## Class template basic_background_player

hamigaki::audio::basic_background_player —

`basic_background_player`は`hamigaki::iostreams::background_copy`をオーディオ操作用に改良したものである。

## Synopsis

    template<typename ExceptionStorage = hamigaki::thread::exception_storage>
    class basic_background_player {
    public:
      // construct/copy/destruct
      basic_background_player();
      template<typename Source, typename Sink>
        basic_background_player(const Source&, const Sink&,
                                std::streamsize = boost::iostreams::default_device_buffer_size);
      ~basic_background_player();

      // modifiers
      template<typename Source, typename Sink>
        void open(const Source&, const Sink&,
                  std::streamsize = boost::iostreams::default_device_buffer_size);
      void close();
      void play();
      void stop();
      std::streampos seek(boost::iostreams::stream_offset, std::ios_base::seekdir);

      // queries
      bool operator!() const;
      bool playing();
      std::streampos tell();
    };

## Description

`basic_background_player`は次に示す３つの状態をとる。

空(empty)
  再生対象となるSource/Sinkが設定されていない
再生中(playing)
  再生操作のためスレッドが動作している
停止中(stopping)
  再生が完了したか中断された

| 注意
多くの場合、Source/Sinkはコピーコンストラクタおよびコピー代入演算子によって複製されると、複製元と複製先でデバイスの状態を共有する。このような共有情報を複製元のデバイスを通して変更してはならない。

### `basic_background_player` construct/copy/destruct

1.     basic_background_player();

   Postconditions: | 状態=空

2.     template<typename Source, typename Sink>
         basic_background_player(const Source& src, const Sink& sink,
                                 std::streamsize buffer_size = boost::iostreams::default_device_buffer_size);

   Effects: | `open(src, sink, buffer_size)`
   Postconditions: | 状態=停止中

3.     ~basic_background_player();

   Effects: | `stop()`を呼び出す。

### `basic_background_player` modifiers

1.     template<typename Source, typename Sink>
         void open(const Source& src, const Sink& sink,
                   std::streamsize buffer_size = boost::iostreams::default_device_buffer_size);

   Requires: | 状態=空
   Effects: | `src`から読み込んだデータを`dest`に書き出すスレッドを起動する。
   Postconditions: | 状態=停止中

2.     void close();

   Requires: | 状態=停止中
   Effects: | `basic_background_player`の保持するSource/Sinkの対を破棄する。
   Notes: | 再生中の場合は、Source/Sinkの対を破棄する前に`stop()`が呼び出される。
   Postconditions: | 状態=空

3.     void play();

   Requires: | 状態=停止中
   Effects: | 再生を開始する。
   Postconditions: | 状態=再生中

4.     void stop();

   Requires: | 状態=再生中または停止中
   Effects: | `copy()`により作成されたスレッドをキャンセルし、その終了を待つ。
   Notes: | この関数はスレッドの終了を待つため、ブロックする。
   Postconditions: | 状態=停止中

5.     std::streampos
       seek(boost::iostreams::stream_offset off, std::ios_base::seekdir way);

   Requires: | 状態=停止中
   Effects: | 入力デバイス`src`がInput-seekableならば、`boost::iostreams::seek(src, off, way, std::ios_base::in)`を呼び出す。
   Returns: | 入力デバイス`src`がInput-seekableならば、入力ヘッドの位置。それ以外の場合は、-1。

### `basic_background_player` queries

1.     bool operator!() const;

   Returns: | 状態=空の場合`true`

2.     bool playing();

   Returns: | 再生中かどうか
   Notes: | この関数は、コピーが完了している場合はスレッドの終了を待つ。
   Postconditions: | `true`を返した場合、状態=再生中。それ以外の場合、状態=停止中

3.     std::streampos tell();

   Requires: | 状態=再生中または停止中
   Returns: | 入力デバイス`src`がInput-seekableならば、入力ヘッドの位置。それ以外の場合は、-1。
   Notes: | コピーが完了あるいは中断された後も、次に`close()`を呼ぶまで値は保持される。

| 製作著作 © 2006, 2007 Takeshi Mouri