FIFO 通信によるマイク入力サンプル。(2)


マイク機能を使ったプログラムを書いてて不満点が発生。


・現在の入力の有無が欲しい
・入力の状態(エッジ)まで欲しい


つーことで追記しました。
ARM9 コードだけ記述が増えてます。


input ライブラリと同じような記述で使えます。
毎フレーム scanMic() でマイクの入力状態を更新。
micIsOn(), micIsOff(), micIsHeld(), micIsCurrent() がそれぞれ
keysDown(), keysUp(), keysHeld(), keysCurrent() と同じ作用をもたらします。


んで 整数データである入力値からオン/オフへの割り振りなのですが
unsigned char 型の AUX 値(12 ビットデータを 4 ビット左シフトしたもの)ですと
128 前後で無音状態、それ以外なら(大きい値、小さい値とも)音を検出してる状態なので
無音値(128 前後)から ±64 を超えた値を拾った場合をオン、
無音値から ±64 以内ならオフという具合で処理してます。


この取り方では甘い!とか何かありましたらコメントに文句でも頂けたらなーと(汗)。


microphone get current value sample


プロジェクト一式
ttp://page.freett.com/ntr/example/mic.zip


ソース


mic.h

/*---------------------------------------------------------------------------------
	
	mic arm9 module header
	
	version 0.02
	Mar 20, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#ifndef _MIC_H_
#define _MIC_H_


#ifdef __cplusplus
extern "C" {
#endif


void micEnable(void);
void micDisable(void);
void scanMic(void);
bool micIsOn(void);
bool micIsOff(void);
bool micIsHeld(void);
bool micIsCurrent(void);
u8 micGetValue8(void);
u16 micGetValue12(void);


#ifdef __cplusplus
}
#endif

#endif	// _MIC_H_


mic.c

/*---------------------------------------------------------------------------------
	
	mic arm9 module routine
	
	version 0.02
	Mar 20, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <nds/ndstypes.h>
#include <nds/fifocommon.h>
#include "micdef.h"
#include "mic.h"


typedef struct{
	u8 value;
	bool bit;
	bool bit_old;
}MicStatus;

static MicStatus st_mic = {0, false, false};


//---------------------------------------------------------------------------------
void micEnable(void){
//---------------------------------------------------------------------------------
	fifoSendValue32(FIFO_USER_01, MIC_ENABLE);
}

//---------------------------------------------------------------------------------
void micDisable(void){
//---------------------------------------------------------------------------------
	fifoSendValue32(FIFO_USER_01, MIC_DISABLE);
}

//---------------------------------------------------------------------------------
void scanMic(void){
//---------------------------------------------------------------------------------
	st_mic.value = micGetValue8();
	st_mic.bit_old = st_mic.bit;
	st_mic.bit = (st_mic.value < 64 || st_mic.value >= 192) ? true:false;
}

//---------------------------------------------------------------------------------
bool micIsOn(void){
//---------------------------------------------------------------------------------
	return st_mic.bit & ~st_mic.bit_old;
}

//---------------------------------------------------------------------------------
bool micIsOff(void){
//---------------------------------------------------------------------------------
	return ~st_mic.bit & st_mic.bit_old;
}

//---------------------------------------------------------------------------------
bool micIsHeld(void){
//---------------------------------------------------------------------------------
	return st_mic.bit & st_mic.bit_old;
}

//---------------------------------------------------------------------------------
bool micIsCurrent(void){
//---------------------------------------------------------------------------------
	return st_mic.bit;
}

//---------------------------------------------------------------------------------
u8 micGetValue8(void){
//---------------------------------------------------------------------------------
	fifoSendValue32(FIFO_USER_01, MIC_GETVAL8);
	
	while(!fifoCheckValue32(FIFO_USER_01));
	
	return (u8)fifoGetValue32(FIFO_USER_01);
}

//---------------------------------------------------------------------------------
u16 micGetValue12(void){
//---------------------------------------------------------------------------------
	fifoSendValue32(FIFO_USER_01, MIC_GETVAL12);
	
	while(!fifoCheckValue32(FIFO_USER_01));
	
	return (u16)fifoGetValue32(FIFO_USER_01);
}

//---------------------------------------------------------------------------------