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; }
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); }
// 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; } }
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(); }