예제 #1
0
int musmidi_cb() {
	midiobj_t *obj = &prv.midi;
	
	switch(obj->st) {
	case MIDI_START:
		obj->in_play = TRUE;
		obj->dev->start(obj->no, obj->dfile->data, obj->dfile->size);
		obj->st = MIDI_STOPCHECK;
		break;
		
	case MIDI_STOPCHECK: {
		midiplaystate st;
		if (NG == obj->dev->getpos(&st)) {
			obj->st = MIDI_LOOPCHECK;
		}
		break;
	}
	case MIDI_LOOPCHECK:
		obj->cnt++;
		if (obj->loop == 0) {
			// infinity loop
			obj->st = MIDI_START;
			break;
		}
		if (--obj->loop == 0) {
			obj->st = MIDI_STOP;
		} else {
			obj->st = MIDI_START;
		}
		break;
		
	case MIDI_STOP:
		obj->dev->stop();
		obj->in_play = FALSE;
		obj->st = MIDI_NOP;
		if (obj->dfile) {
			ald_freedata(obj->dfile);
			obj->dfile = NULL;
		}
		break;

	case MIDI_PAUSE:
		obj->dev->pause();
		obj->st = MIDI_NOP;
		break;
		
	case MIDI_UNPAUSE:
		obj->dev->unpause();
		obj->st = MIDI_STOPCHECK;
		break;
		
	case MIDI_NOP:
		break;
	}

	return OK;
}
예제 #2
0
파일: cmdl.c 프로젝트: avan06/ONScripter-CN
void commandLL() {
	int type = sys_getc();
	int link_no = getCaliValue();
	int *var, _var = 0;
	int num, i;
	dridata *dfile = ald_getdata(DRIFILE_DATA, link_no - 1);
	WORD *data;
	
	if (dfile == NULL) {
		getCaliValue();
		getCaliValue();
		sysVar[0] = 255;
		return;
	}
	
	data = (WORD *)dfile->data;
	
	switch(type) {
	case 0: /* T2 */
		var = getCaliVariable();
		num  = getCaliValue();

		DEBUG_COMMAND("LL %d,%d,%d,%d:\n",type, link_no, _var, num);
		
		if (dfile->size < num * sizeof(WORD)) {
			WARNING("data shortage (req = %d, result = %d)\n", num, dfile->size/ sizeof(WORD));
			/* sysVar[0] = 254; 大嘘*/
			/* return; */
			num = dfile->size / sizeof(WORD);
		}
		for (i = 0; i < num; i++) {
#ifdef WORDS_BIGENDIAN
			*var = swap16(*data); var++; data++;
#else
			*var = *data; var++; data++;
#endif
		}
		break;
		
	case 1:
		_var = getCaliValue();
		num  = getCaliValue();
		DEBUG_COMMAND_YET("LL1 not yet %d, %d\n", _var, num);
		sysVar[0] = 255;
		goto out;
		break;
		
	default:
		WARNING("Unknown LL command %d\n", type);
		goto out;
	}
	
	sysVar[0] = 0;

 out:
	ald_freedata(dfile);
}
예제 #3
0
/**
 * pcmlib_{load|mixlr}で読み込んだWAVFILEの解放
 * @param wfile: 解放するデータ
 * @return なし
 */
void pcmlib_free(WAVFILE *wfile) {
	if (wfile == NULL) return;
	
	if (wfile->dfile) {
		ald_freedata((dridata *)(wfile->dfile));
	} else {
		g_free(wfile->data);
	}
	
	g_free(wfile);
}
예제 #4
0
// メモリ上で加工できるようロードしてコピー
WAVFILE *pcmlib_load_rw(int no) {
    dridata *dfile;
    WAVFILE *wfile;

    dfile = ald_getdata(DRIFILE_WAVE, no -1);
    if (dfile == NULL) {
        WARNING("DRIFILE_WAVE fail to open %d\n", no -1);
        return NULL;
    }

    wfile = wav_getinfo(dfile->data);
    if (wfile) {
        void *p = g_malloc(wfile->bytes);
        memcpy(p, wfile->data, wfile->bytes);
        wfile->data = (BYTE *)p;
        wfile->dfile = NULL;
    }

    ald_freedata(dfile);

    return wfile;
}
예제 #5
0
/**
 * 指定の番号の .WAV|.OGG をロードする。
 * @param no: DRIファイル番号
 * @return: WAVFILE object
 */
WAVFILE *pcmlib_load(int no) {
	dridata *dfile;
	WAVFILE *wfile;
	
	dfile = ald_getdata(DRIFILE_WAVE, no -1);
	if (dfile == NULL) {
		WARNING("DRIFILE_WAVE fail to open %d\n", no -1);
		return NULL;
	}
	
	wfile = wav_getinfo(dfile->data);
	if (wfile == NULL) {
		wfile = ogg_getinfo(dfile->data, dfile->size);
		if (wfile == NULL) {
			WARNING("not .wav or .ogg file\n");
			ald_freedata(dfile);
			return NULL;
		}
	}
	
	wfile->dfile = dfile;
	
	return wfile;
}