static int midi_exit() {
	if (enabled) {
		midi_stop();
		if (0 > shmdt((char *)flags)) {
			perror("shmdt");
		}
		if (0 > shmctl(shmkey, IPC_RMID, 0)) {
			perror("shmctl");
		}
	}
	return OK;
}
Beispiel #2
0
void cleanup(void)
{
    msg_log(MSG_MESSAGE, "Cleanup...\n");
    session_cleanup();
    dish_file_state_cleanup();
    midi_stop();
    driver_stop();
    patch_shutdown();
    mixer_shutdown();
    settings_write();
    settings_free();
    free_instance_name();
    mod_src_destroy();

    msg_log(MSG_MESSAGE, "Goodbye!\n");

    exit(0);
}
Beispiel #3
0
// int 8 (timer)
void interrupt_handler() {
	switch (command) {
	case 1:
		midi_stop();
		midi_buffer_hi = parameter;
		break;
	case 2:
		midi_stop();
		midi_buffer_lo = parameter;
		break;
	case 3:
		midi_buffer_size = parameter;
		break;
	case 4:
		midi_resume();
		break;
	case 5:
		midi_fadeout_and_stop();
		break;
	case 6:
		midi_pause();
		eak;
	case 7:
		voices[parameter & 0xFF].volume = parameter >> 8;
		break;
	case 8:
		midi_fade_in_flag = parameter != 0;
		break;
	case 9:
		midi_fade_out_flag = parameter != 0;
		break;
	case 10:
		midi_volume = parameter;
		break;
	case 11:
		reset_hw_timer();
		ADLIB_mute_voices();
		set_interrupt_handler(8, old_interrupt_handler);
		break;
	case 12:
		parameter = driver_status;
		break;
	case 13:
		midi_fade_volume_change_rate = parameter & 0xFF;
		fadeout_volume_cur = 0;
		fadein_volume_cur = 0;
		break;
	case 14:
		parameter = midi_volume;
		break;
	case 15:
		parameter = midi_fade_in_flag;
		break;
	case 16:
		parameter = midi_fade_out_flag;
		break;
	case 17:
		midi_tempo = parameter & 0xFF;
		midi_set_tempo();
		break;
	case 18:
		parameter = midi_tempo;
		break;
	case 19:
		parameter = midi_fade_volume_change_rate;
		break;
	case 20:
		midi_loop = parameter != 0;
		break;
	case 21:
		parameter = midi_loop;
		break;
	case 22:
		parameter = 0xF0;	// version??
		break;
	case 23:
		parameter = 1;		// version??
		break;
	case 24:
		voices[parameter & 0xFF].program = parameter >> 8;
		break;
	case 25:
		parameter = voices[parameter & 0xFF].program;
		break;
	}
	
	command = 0;
	midi_driver();
	interrupt_cycles++;
	if (interrupt_cycles >= interrupt_ratio) {
		old_interrupt_handler();
		interrupt_cycles = 0;
	}
}
Beispiel #4
0
void dspio_stop_midi(void *dspio)
{
    DSPIO->midi_time_cur = GETusTIME(0);
    midi_stop();
}
//=======================================================
// メインループ関数
//=======================================================
void MainLoop(void)
{
	ARUint8          *image;			// カメラキャプチャ画像
	ARMarkerInfo     *marker_info;		// マーカ情報
	int              marker_num;		// 検出されたマーカの数
	int              i, j, k;

	// カメラ画像の取得
	if( (image = (ARUint8 *)arVideoGetImage()) == NULL ){
		arUtilSleep( 2 );
		return;
	}
	if( count == 0 ) arUtilTimerReset();
	count++;

	// カメラ画像の描画
	argDrawMode2D();
	argDispImage( image, 0, 0 );


	// マーカの検出と認識
	if( arDetectMarker( image, thresh, &marker_info, &marker_num ) < 0 ){
		Cleanup();
		exit(0);
	}

	// 次の画像のキャプチャ指示
	arVideoCapNext();

	// 3Dオブジェクトを描画するための準備
	argDrawMode3D();
	argDraw3dCamera( 0, 0 );
	glClearDepth(1.0);					// デプスバッファの消去値
	glClear( GL_DEPTH_BUFFER_BIT );		// デプスバッファの初期化

	if(movex[0]!=0 && movex[3]!=0 && movex[7]!=0){
		rmove++;
		
		if(rmove!=0){
			Drawnashi( marker[3].mark_id, marker[3].patt_trans);
		}
		if(rmove>40.0){
			rmove=0.0;
			for(int i=0;i<MARK_NUM;i++){
				movex[i]=0;
			}
		}
	}else{
		// マーカの一致度の比較
		for( i=0; i<MARK_NUM; i++ ){
			k = -1;
			for( j=0; j<marker_num; j++ ){
				if( marker[i].patt_id == marker_info[j].id ){
					if( k == -1 ) k = j;
					else if( marker_info[k].cf < marker_info[j].cf ) k = j;
				}
			}

			// マーカーが見つからなかったとき
			if( k == -1 ){
				if(marker[i].visible != 0){
					midi_out(i+1);
					midi_stop(i+1);
					movex[i]=1;
					marker[i].visible = 0;
				}else if(movex[i]!=0){
					DrawObject( marker[i].mark_id, marker[i].patt_trans,i );
				}
			}else{
				// 座標変換行列を取得
				if( marker[i].visible == 0 ) {
					// 1フレームを使ってマーカの位置・姿勢(座標変換行列)の計算
					arGetTransMat( &marker_info[k], marker[i].patt_center, marker[i].patt_width, marker[i].patt_trans );    //初回の認識ではarGetTransMatを2回目以降ではarGetTransMatContを使うと安定するらしい
					marker[i].visible = 1;

				} else {
					// 前のフレームを使ってマーカの位置・姿勢(座標変換行列)の計算
					arGetTransMatCont( &marker_info[k], marker[i].patt_trans, marker[i].patt_center, marker[i].patt_width, marker[i].patt_trans );
				}

				// 3Dオブジェクトの描画
				if(movex[i]!=0){
					DrawObject( marker[i].mark_id, marker[i].patt_trans,i );
				}
			}
			if(movex[i]>=40.0) movex[i]=0;
			if(movex[i]!=0) movex[i]++;
		}
	}
	// バッファの内容を画面に表示
	argSwapBuffers();
}