- メインページ
- ネームスペース
- クラス
- ファイル

- ファイル一覧
- ファイルメンバ

# dline.cpp

説明を見る。

    00001 /**
    00002    * \file dline.cpp
    00003    * \brief 遅延バッファの実装
    00004    *
    00005    */
    00006 #include "dline.h"
    00007 namespace dline{
    00008     CShifter::CShifter( int aMaxDelay )
    00009     {
    00010         head = 0;
    00011         maxDelay = aMaxDelay;
    00012         state = new shortfract[maxDelay];
    00013
    00014         if ( state ){           // 割り当てに成功
    00015             for ( unsigned int i=0; i < maxDelay; i++ )
    00016                 state[i] = 0.0r;
    00017         }
    00018     }
    00019
    00020     CShifter::~CShifter(void)
    00021     {
    00022         if ( state )    //  割り当てに成功しているか
    00023             delete[] state;
    00024     }
    00025
    00026     void CShifter::run( const shortfract in[], shortfract out[], int count, int delay )
    00027     {
    00028         int delayIndex;             // 遅延データのインデックス
    00029
    00030         if ( delay >= maxDelay )    // maxDelayより大きな遅延は、maxDelayだけ遅延させる。
    00031             delay = maxDelay - 1;
    00032
    00033         if ( state ){    // 割り当てに成功しているか
    00034             for( int i = 0; i<count; i++ ){
    00035                 state[head] = in[i];            // サンプルを遅延バッファに格納
    00036                 delayIndex = head + delay;      // 出力するデータの位置を計算
    00037                 if ( delayIndex >= maxDelay )   // 遅延データがバッファの上側境界を超えたところなら
    00038                     delayIndex -= maxDelay;     // ラップアラウンド
    00039                 out[i] = state[delayIndex];     // 遅延データを出力
    00040                 head --;                        // 遅延バッファの先頭を更新
    00041                 if ( head < 0 )                 // バッファの先頭がバッファの下側境界を超えたら
    00042                     head = maxDelay - 1;        // ラップアラウンド
    00043             }
    00044         }
    00045         else            // state 割り当て失敗の場合
    00046             for( int i = 0; i<count; i++ )
    00047                 out[i] = in[i];            // 入力をそのまま出力
    00048     }
    00049 };