27    class AxVoiceParamBlock
 
   35        operator AXVPB *() { 
return mVpb; }
 
   38        bool IsAvailable()
 const { 
return mVpb != 
nullptr; }
 
   41            return IsAvailable() && mVpb->pb.state == AX_VOICE_RUN;
 
   43        ulong GetLoopAddress()
 const 
   48            return (mVpb->pb.addr.loopAddressHi << 16)
 
   49                 + mVpb->pb.addr.loopAddressLo;
 
   51        ulong GetEndAddress()
 const 
   56            return (mVpb->pb.addr.endAddressHi << 16)
 
   57                   + mVpb->pb.addr.endAddressLo;
 
   59        ulong GetCurrentAddress()
 const 
   64            return (mVpb->pb.addr.currentAddressHi << 16)
 
   65                 + mVpb->pb.addr.currentAddressLo;
 
   67        bool IsLpfEnable()
 const 
   69            return IsAvailable() && mVpb->pb.lpf.on == AX_PB_LPF_ON;
 
   72        bool IsBiquadEnable()
 const 
   74            return IsAvailable() && mVpb->pb.biquad.on == AX_PB_BIQUAD_ON;
 
   76        bool IsRmtIirEnable() 
const;
 
   78        void SetVoiceAddr(AXPBADDR 
const &addr)
 
   84            AXSetVoiceAddr(mVpb, 
const_cast<AXPBADDR *
>(&addr));
 
   87        void SetVoicePriority(ulong priority)
 
   92            AXSetVoicePriority(mVpb, priority);
 
   94        void SetVoiceSrcType(ulong type);
 
   95        void SetVoiceStateRun()
 
  100            AXSetVoiceState(mVpb, AX_VOICE_RUN);
 
  102        void SetVoiceStateStop()
 
  107            AXSetVoiceState(mVpb, AX_VOICE_STOP);
 
  109        void SetVoiceType(u16 type);
 
  110        void SetVoiceMix(AXPBMIX 
const &mix, 
bool immediatelySync);
 
  111        void SetVoiceVe(u16 volume, u16 initVolume);
 
  112        void SetVoiceLoop(u16 loop);
 
  113        void SetVoiceLoopAddr(ulong addr);
 
  114        void SetVoiceEndAddr(ulong addr);
 
  115        void SetVoiceAdpcm(AXPBADPCM 
const &adpcm);
 
  116        void SetVoiceSrc(AXPBSRC 
const &src);
 
  117        void SetVoiceSrcRatio(f32 ratio);
 
  118        void SetVoiceAdpcmLoop(AXPBADPCMLOOP 
const &adpcmloop);
 
  119        void SetVoiceLpf(AXPBLPF 
const &lpf);
 
  120        void SetVoiceLpfCoefs(u16 a0, u16 b0);
 
  121        void SetVoiceBiquad(AXPBBIQUAD 
const &biquad);
 
  122        void SetVoiceBiquadCoefs(u16 b0, u16 b1, u16 b2, u16 a1, u16 a2);
 
  124        void SetVoiceRmtOn(u16 on);
 
  126        void SetVoiceRmtIIRCoefs(u16 type, ...);
 
  128        void Set(AXVPB *vpb);
 
  136        static u16 
const DEFAULT_VOLUME = AX_MAX_VOLUME;
 
  142        AXPBVE  
volatile mPrevVeSetting;    
 
  143        bool    mFirstVeUpdateFlag;         
 
 
  154        enum AxVoiceCallbackStatus
 
  156            CALLBACK_STATUS_CANCEL,
 
  157            CALLBACK_STATUS_DROP_DSP,
 
  182        typedef void Callback(AxVoice *dropVoice, AxVoiceCallbackStatus status,
 
  224        void Setup(
void const *waveAddr, SampleFormat format, 
int sampleRate);
 
  226        SampleFormat GetFormat()
 const { 
return mFormat; }
 
  227        ulong GetCurrentPlayingSample() 
const;
 
  228        ulong GetCurrentPlayingDspAddress() 
const;
 
  229        ulong GetLoopEndDspAddress() 
const;
 
  230        f32 GetDspRatio(f32 ratio)
 const 
  232            return ratio * mSampleRate / AX_SAMPLE_RATE;
 
  235        void SetLoopStart(
void const *baseAddress, ulong samples);
 
  236        void SetLoopEnd(
void const *baseAddress, ulong samples);
 
  237        void SetLoopFlag(
bool loopFlag);
 
  238        void SetPriority(ulong priority);
 
  239        void SetVoiceType(VoiceType type);
 
  240        void EnableRemote(
bool enable);
 
  242        void SetAddr(
bool loopFlag, 
void const *waveAddr, ulong startOffset,
 
  243                     ulong loopStart, ulong loopEnd);
 
  244        void SetSrcType(SrcType type, f32 pitch);
 
  246        void SetAdpcmLoop(AdpcmLoopParam 
const *param);
 
  247        bool SetMix(MixParam 
const ¶m);
 
  248        void SetRmtMix(
const RemoteMixParam ¶m);
 
  249        void SetSrc(f32 ratio, 
bool initialUpdate);
 
  250        void SetVe(f32 volume, f32 initVolume);
 
  251        void SetLpf(u16 freq);
 
  252        void SetBiquad(u8 filterType, f32 value);
 
  253        void SetRemoteFilter(u8 filter);
 
  256        bool IsDataAddressCoverd(
void const *beginAddress,
 
  257                                 void const *endAddress) 
const;
 
  258        bool IsNeedNextUpdate(MixParam 
const ¶m) 
const;
 
  259        bool IsPlayFinished() 
const;
 
  261        void Run() { mVpb.SetVoiceStateRun(); }
 
  262        bool IsRun()
 const { 
return mVpb.IsRun(); }
 
  263        void Stop() { mVpb.SetVoiceStateStop(); }
 
  264        void StopAtPoint(
void const *baseAddress, ulong samples);
 
  265        void Sync() { mVpb.Sync(); }
 
  267        static ulong GetDspAddressBySample(
void const *baseAddress, ulong samples,
 
  268                                         SampleFormat format);
 
  269        static ulong GetSampleByDspAddress(
void const *baseAddress, ulong addr,
 
  270                                         SampleFormat format);
 
  272        static u16 GetAxFormatFromSampleFormat(SampleFormat sampleFormat);
 
  274        static void CalcOffsetAdpcmParam(u16 *outPredScale, u16 *outYn1,
 
  275                                         u16 *outYn2, ulong offset,
 
  276                                         const void *dataAddr,
 
  277                                         AdpcmParam 
const &adpcmParam);
 
  281        static void VoiceCallback(
void *callbackData);
 
  285        static u16 
const VOICE_GAIN_MAX;
 
  289        AxVoiceParamBlock   mVpb;                   
 
  290        void                const *mWaveData;       
 
  291        SampleFormat        mFormat;                
 
  293        bool                mFirstMixUpdateFlag;    
 
  294        bool                mReserveForFreeFlag;    
 
  300        ut::LinkListNode    node;                   
 
  304        friend class AxVoiceManager;