正直日記



2005/08/18

_ プチノイズ解消
久しぶりにソースを弄ったらプチノイズの問題が解決したのでプチ小躍りし
てしまったよ。サンプリング周波数を替えるときに I/Oレジスタを触る順番
を間違えてた。

本来は、素直に
CODE_IN_IWRAM
void 
PDRV_Switch(s8 *buf)
{
	// DMA書き換え
	REG_DMA1CNT = 0;
	REG_DMA1SAD = (u32 *)buf;
	REG_DMA1CNT = DMA_DEST_FIX | DMA_SRC_INC | DMA_REPEAT 
	              | DMA_16BIT | DMA_FIFO | DMA_ENABLE;
	// タイマ書き換え
	if (pdrvw.old_rateNum != pdrvw.rateNum) {
		REG_TM0CNT = 0;
		REG_TM0D = RateTable[pdrvw.rateNum].count;
		REG_TM0CNT = TIMER_PRESCALER_1CLK | TIMER_ENABLE;
		pdrvw.old_rateNum = pdrvw.rateNum;
	}
}
こう書かなきゃいけないところを
CODE_IN_IWRAM
void 
PDRV_Switch(s8 *buf)
{
	// とりあえずDMAを止めておいて……
	REG_DMA1CNT = 0;
	// すかさずタイマ書き換え
	if (pdrvw.old_rateNum != pdrvw.rateNum) {
		REG_TM0CNT = 0;
		REG_TM0D = RateTable[pdrvw.rateNum].count;
		REG_TM0CNT = TIMER_PRESCALER_1CLK | TIMER_ENABLE;
		pdrvw.old_rateNum = pdrvw.rateNum;
	}
	// そしてDMA再開
	REG_DMA1SAD = (u32 *)buf;
	REG_DMA1CNT = DMA_DEST_FIX | DMA_SRC_INC | DMA_REPEAT 
	              | DMA_16BIT | DMA_FIFO | DMA_ENABLE;
}
こう書いてたわけだ。 DMAが止まっている間にDirectSound(ダイレクトにサウンドを流し込むから DirectSoundって名づけたそうだよって京都の某I社の人が昔ゆってたよ(^^;) から転送要求が発生してプチノイズが鳴っておった。俺の馬鹿め。 まあ、これでピッチや負荷によって動的にサンプリング周波数を変える機構 が完成したわけだ。めでたい。

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12