MAKE = make
CC = gcc
-WITH_VERIFY = yes
+WITH_VERIFY = no
FLAGS_DEBUG = -g
CC_FLAGS = -Wall
LD_FLAGS = -lpthread
TARGET = playumidi
HEADERS = playumidi.h
-OBJS = main.o smf.o midievent.o play_event.o
+OBJS = main.o \
+ smf.o \
+ midievent.o \
+ play_event.o \
+ micro_sleep.o
.if $(WITH_VERIFY) == "yes"
VERIFY_OBJS = verify_event.o
$(CC) -c -o verify_event.o $(CC_FLAGS) $(FLAGS_DEBUG) $(FLAGS_VERIFY) verify_event.c
.endif
+micro_sleep.o: micro_sleep.c $(HEADERS)
+ $(CC) -c -o micro_sleep.o $(CC_FLAGS) $(FLAGS_DEBUG) $(FLAGS_VERIFY) micro_sleep.c
play_event.o: play_event.c $(HEADERS)
$(CC) -c -o play_event.o $(CC_FLAGS) $(FLAGS_DEBUG) $(FLAGS_VERIFY) play_event.c
midievent.o: midievent.c $(HEADERS)
return 0x00;
}
+ MSleep_Ajust();
+
i_err = pthread_create( &t_thread, NULL,
(void *)PlayEvent_Play, (void *)NULL );
if( 0x00 != i_err ) {
--- /dev/null
+
+#define PLAYUMIDI_SRC_MSLEEP
+
+#include<stdio.h>
+#include<unistd.h>
+#include<sys/time.h>
+#include"playumidi.h"
+
+
+long gl_min_usleep = DEFAULT_MIN_SLEEP;
+
+
+/* ===================================================================*/
+EXTERN_FUNC_MSLEEP
+long MSleep_Ajust(
+ void ) {
+
+ int i_cnt;
+ long l_times;
+ long l_value;
+ struct timeval tv_start;
+ struct timeval tv_end;
+
+ l_times = 0;
+ for( i_cnt = 0; i_cnt < MSLEEP_AJUST_COUNT; i_cnt++ ) {
+
+ gettimeofday( &tv_start, NULL );
+ usleep( MSLEEP_USLEEP_TIME );
+ gettimeofday( &tv_end, NULL );
+
+ if( tv_start.tv_sec == tv_end.tv_sec ) {
+ l_value = tv_end.tv_usec - tv_start.tv_usec;
+ } else {
+ l_value = (tv_end.tv_sec - tv_start.tv_sec) * 1000000;
+ l_value += (tv_end.tv_usec + (1000000 - tv_start.tv_usec));
+ }
+
+ l_times += l_value;
+ }
+
+ l_times /= MSLEEP_AJUST_COUNT;
+
+ gl_min_usleep = l_times + (l_times / 12);
+
+ return gl_min_usleep;
+}
+
+
+/* ===================================================================*/
+EXTERN_FUNC_MSLEEP
+int MSleep_MicroSleep(
+ long l_usleep ) {
+
+ long l_diff;
+ struct timeval tv_start;
+ struct timeval tv_end;
+
+ gettimeofday( &tv_start, NULL );
+ l_diff = 0;
+ do {
+ if( gl_min_usleep < (l_usleep-l_diff) )
+ { usleep( MSLEEP_USLEEP_TIME ); }
+
+ gettimeofday( &tv_end, NULL );
+
+ if( tv_start.tv_sec == tv_end.tv_sec ) {
+ l_diff = tv_end.tv_usec - tv_start.tv_usec;
+ } else if( tv_start.tv_sec + 1 == tv_end.tv_sec ) {
+ l_diff = (tv_end.tv_usec + (1000000 - tv_start.tv_usec));
+ } else {
+ l_diff = (tv_end.tv_sec - tv_start.tv_sec) * 1000000;
+ l_diff += (tv_end.tv_usec + (1000000 - tv_start.tv_usec));
+ }
+
+ }while( l_usleep > l_diff );
+
+ return 0x00;
+}
+
Byte b_status;
int i_umidi[MAX_UMIDI_PORT];
int i_len;
- //int i_cnt;
- //size_t sz_write;
DWord dw_wait;
MidiInfo t_midi;
if( 0 < p_mevent->dw_delta ) {
dw_wait = (p_mevent->dw_delta * gdw_deltabase);
- usleep( dw_wait );
+ MSleep_MicroSleep( (long)dw_wait );
}
if( IS_PLAYSTATUS_REQUEST( gb_status ) ) {
if( SMF_EVENT_SYSEX_F0 == b_status ) {
pb_data = (pb_vardata + p_mevent->dw_dataptr);
i_len = p_mevent->dw_length;
- //i_len = p_mevent->b_data[1] + 1;
}
else if( SMF_EVENT_SYSEX_F7 == b_status ) {
pb_data = (pb_vardata + p_mevent->dw_dataptr);
i_len = p_mevent->dw_length;
- //i_len = p_mevent->b_data[1];
}
else if( SMF_EVENT_META == b_status ) {
pb_data = (pb_vardata + p_mevent->dw_dataptr);
i_len = p_mevent->dw_length;
- //i_len = p_mevent->b_data[2] + 3;
i_len = Play_MetaEvent( p_mevent, pb_data, i_len );
-#define MAX_UMIDI_PORT 4
-#define DEFAULT_TEMPO 500000 /* Default tempo = 120 */
+#define MAX_UMIDI_PORT 4
+#define DEFAULT_TEMPO 500000 /* Default tempo = 120 */
#define UMIDIDEV_RETRY_WRITE 3
+#define DEFAULT_MIN_SLEEP 2050 /* usec */
+#define MSLEEP_USLEEP_TIME 1000
+#define MSLEEP_AJUST_COUNT 50
+
typedef unsigned char Byte;
EXTERN_FUNC_PLAY_EVENT int PlayEvent_Initialize( void );
EXTERN_FUNC_PLAY_EVENT int PlayEvent_Term( void );
+
+#ifndef PLAYUMIDI_SRC_MSLEEP
+ #define EXTERN_FUNC_MSLEEP extern
+#else
+ #define EXTERN_FUNC_MSLEEP
+#endif
+EXTERN_FUNC_MSLEEP long MSleep_Ajust( void );
+EXTERN_FUNC_MSLEEP int MSleep_MicroSleep( long l_usleep );
+
+
#ifdef VERIFY_EVENT
#ifndef PLAYUMIDI_SRC_VERIFY_EVENT
extern int Veryfy_Event( TrackInfo *p_track_start, Word uw_tracks );