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;