OSDN Git Service

* Merge Branch[BUG33030]
authorkoinec(Koine Yuusuke) <koinec@users.sourceforge.jp>
Tue, 28 Jan 2014 11:19:27 +0000 (20:19 +0900)
committerkoinec(Koine Yuusuke) <koinec@users.sourceforge.jp>
Tue, 28 Jan 2014 11:19:27 +0000 (20:19 +0900)
src/Makefile
src/main.c
src/play_event.c
src/playumidi.h
src/smf.c
src/verify_event.c

index 58d7fad..2f91cd6 100644 (file)
@@ -2,7 +2,7 @@
 MAKE = make
 CC = gcc
 
-WITH_VERIFY    = no
+WITH_VERIFY    = yes
 
 FLAGS_DEBUG = -g
 CC_FLAGS = -Wall
index e7234c3..2d56a61 100644 (file)
@@ -120,7 +120,6 @@ int main(
 
        PlayEvent_Term();
 
-
        return 0x00;
 }
 
index 6682fce..0430697 100644 (file)
@@ -92,11 +92,14 @@ int Play_MetaEvent(
                i_ret   = 0x00;
        }
        else if( SMF_META_PORT == b_meta )      {
+               
+               puts("port!!");
 
                i_ret   = 0x00;
        }
        else if( SMF_META_SMPTEOFFSET == b_meta )       {
 
+               puts("smtpe!!");
                i_ret   = 0x00;
        }
        /* Output Text for PC-Console */
@@ -112,6 +115,9 @@ int Play_MetaEvent(
                *(pb_var + i_len + 3)   = b_save;
                i_ret   = 0x00;
        }
+       else    {
+               i_ret   = 0x00;
+       }
 
 //SMF_META_SEQUENCENO  /* Ignore for SMF0/1 */
 //SMF_META_CHNPREFIX
@@ -264,17 +270,20 @@ EXTERN_FUNC_PLAY_EVENT
                        
                        if( SMF_EVENT_SYSEX_F0 == b_status )    {
                                pb_data = (pb_vardata + p_mevent->dw_dataptr);
-                               i_len   = p_mevent->b_data[1] + 1;
+                               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->b_data[1];
+                               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->b_data[2] + 3;
+                               i_len   = p_mevent->dw_length;
+                               //i_len = p_mevent->b_data[2] + 3;
 
                                i_len   = Play_MetaEvent( p_mevent, pb_data, i_len );
                                
index e76315f..0252d6e 100644 (file)
@@ -37,6 +37,7 @@ typedef       struct  {
 typedef        struct  {
        DWord           dw_delta;
        DWord           dw_dataptr;
+       DWord           dw_length;
        Byte            b_data[3];
        Byte            b_run_status;
 #ifdef VERIFY_EVENT
@@ -117,7 +118,7 @@ typedef struct      {
 #else
        #define EXTERN_FUNC_SMF 
 #endif
-EXTERN_FUNC_SMF        int ReadDeltaTime( DWord *dw_delta, Byte *pb_now );
+EXTERN_FUNC_SMF        int DecodeValue( DWord *dw_delta, Byte *pb_now );
 EXTERN_FUNC_SMF        int ReadMidiFile( Byte *pb_fbuf );
 
 
index 7a17e3c..c58cc5d 100644 (file)
--- a/src/smf.c
+++ b/src/smf.c
@@ -15,7 +15,7 @@ TrackInfo     *gp_trackinfo;
 
 /* ===================================================================*/
 EXTERN_FUNC_SMF
-int    ReadDeltaTime(
+int    DecodeValue(
                DWord   *dw_delta,
                Byte    *pb_now )       {
        
@@ -92,7 +92,7 @@ int Read_SMFTrackHeader(
                p_track->pb_data                = pb_buf + sizeof(SmfTrackHeader);
                p_track->pb_now                 = pb_buf + sizeof(SmfTrackHeader);
 
-               ReadDeltaTime( &dw_delta, p_track->pb_now );
+               DecodeValue( &dw_delta, p_track->pb_now );
                p_track->dw_delta_now   = dw_delta;             
                p_track->b_run_status   = 0x00;
 
@@ -157,6 +157,7 @@ int CheckSMFTrack(
        DWord   dw_events;
        DWord   dw_varsize;
        DWord   dw_delta;
+       DWord   dw_temp;
        TrackInfo       *p_track;
 
        dw_events               = 0;
@@ -172,7 +173,7 @@ int CheckSMFTrack(
 
                do      {
                        /* Read DeltaTime */
-                       i_result        = ReadDeltaTime( &dw_delta, pb_now );
+                       i_result        = DecodeValue( &dw_delta, pb_now );
                        if( 4 < i_result )              {
                                printf("Error!!: [Trk %d] DeltaTime Value is Wrong!", i_track );
                                return 0x01;
@@ -220,24 +221,27 @@ int       CheckSMFTrack(
                        else if( SMF_EVENT_SYSEX_META == b_value )      {
 
                                if( SMF_EVENT_SYSEX_F0 == *pb_now )     {
-                                       dw_varsize      += *(pb_now + 1) + 1;
-                                       i_temp          = *(pb_now+1) + 2;
-                                       pb_now          += i_temp;
-                                       dw_trksize      -= i_temp;
+                                       
+                                       i_temp  = DecodeValue( &dw_temp, (pb_now + 1) );
+                                       dw_varsize      += (dw_temp + 1);
+                                       pb_now          += (i_temp + dw_temp + 1);
+                                       dw_trksize      -= (i_temp + dw_temp + 1);
                                }
                                else if( SMF_EVENT_SYSEX_F7 == *pb_now )        {
-                                       dw_varsize      += *(pb_now + 1);
-                                       i_temp          =  *(pb_now + 1) + 2;
-                                       pb_now          += i_temp;
-                                       dw_trksize      -= i_temp;
+
+                                       i_temp  = DecodeValue( &dw_temp, (pb_now + 1) );
+                                       dw_varsize      += dw_temp;
+                                       pb_now          += (i_temp + dw_temp + 1);
+                                       dw_trksize      -= (i_temp + dw_temp + 1);
                                }
                                else if( SMF_EVENT_META == *pb_now )    {
-                                       i_temp          =  *(pb_now + 2) + 3;
-                                       dw_varsize      += i_temp;
-                                       pb_now          += i_temp;
-                                       dw_trksize      -= i_temp;
 
-                                       if( SMF_META_TRACKEND == *(pb_now - i_temp + 1) )       {
+                                       i_temp  = DecodeValue( &dw_temp, (pb_now + 2) );
+                                       dw_varsize      += (dw_temp + i_temp + 2);
+                                       pb_now          += (dw_temp + i_temp + 2);
+                                       dw_trksize      -= (dw_temp + i_temp + 2);
+
+                                       if( SMF_META_TRACKEND == *(pb_now - (dw_temp + i_temp + 1)) )   {
                                                if( 0 == dw_trksize )   {
                                                        printf(" [Trk %d] Track Check is OK.\n", i_track);
                                                } else  {
@@ -313,7 +317,7 @@ int ReadSMFTrack(
                /* Proc.02 - Set MidiEventInfo */
                p_now_event->dw_delta   = dw_delta;
        
-               i_result        = ReadDeltaTime( &dw_temp, p_now_track->pb_now );
+               i_result        = DecodeValue( &dw_temp, p_now_track->pb_now );
                p_now_track->pb_now     += i_result;
 
 #ifdef VERIFY_EVENT
@@ -346,6 +350,7 @@ int ReadSMFTrack(
                                p_now_track->b_run_status       = p_now_event->b_data[0];
                                assert( p_now_event->b_data[0] & 0x80 );
                        }
+                       p_now_event->dw_length  = 3;
                }
                /* 2Byte Data */
                else if( ( SMF_EVENT_PROGCHANGE == b_data ) || ( SMF_EVENT_CHNPRESSER == b_data ))      {
@@ -361,53 +366,74 @@ int ReadSMFTrack(
                                p_now_track->b_run_status       = p_now_event->b_data[0];
                                assert( p_now_event->b_data[0] & 0x80 );
                        }
+                       p_now_event->dw_length  = 2;
                }
                /* Var Data */
                else if( SMF_EVENT_SYSEX_META == b_data )       {
 
                        if( SMF_EVENT_SYSEX_F0 == *(p_now_track->pb_now) )      {
 
+                               /* Proc. 1Byte */
                                p_now_event->b_data[0]  = *(p_now_track->pb_now + 0);
-                               p_now_event->b_data[1]  = *(p_now_track->pb_now + 1); /* size */
-                                       /* CAUTION!!: b_data[1] is DataSize "-1" Byte!! */
-
                                p_now_event->dw_dataptr = dw_now_varsize;
+
                                *pb_now_vardata++       = p_now_event->b_data[0];               /* 1Byte */
                                dw_now_varsize++;
+                               p_now_track->pb_now++;
 
-                               sz_size = (size_t)(p_now_event->b_data[1]);             /* +1Byte = F7 */
-                               memcpy( pb_now_vardata, (p_now_track->pb_now + 2), sz_size);
-                               pb_now_vardata  += sz_size;
-                               dw_now_varsize  += sz_size;
+                               /* Proc. Length */
+                               i_result        = DecodeValue( &dw_temp, p_now_track->pb_now );
+                               sz_size         = (size_t)dw_temp;
+                               p_now_track->pb_now             += i_result;
+
+                               /* Proc. Data */
+                               memcpy( pb_now_vardata, p_now_track->pb_now, sz_size);
+                               pb_now_vardata          += sz_size;
+                               dw_now_varsize          += sz_size;
+                               p_now_track->pb_now     += sz_size;
+
+                               p_now_event->dw_length  = sz_size + 1;
 
-                               p_now_track->pb_now     += (sz_size + 2);
                                //p_now_track->b_run_status     = 0x00;
                        }
                        else if( SMF_EVENT_SYSEX_F7 == *(p_now_track->pb_now) ) {
 
+                               /* Proc. 1Byte */
                                p_now_event->b_data[0]  = *(p_now_track->pb_now + 0);
-                               p_now_event->b_data[1]  = *(p_now_track->pb_now + 1); /* size */
+                               p_now_track->pb_now++;
+
+                               /* Proc. Length */
+                               i_result        = DecodeValue( &dw_temp, p_now_track->pb_now );
+                               sz_size         = (size_t)dw_temp;
+                               p_now_track->pb_now             += i_result;
 
+                               /* Proc. Data */
                                p_now_event->dw_dataptr = dw_now_varsize;
-                               sz_size = (size_t)(p_now_event->b_data[1]);
-                               memcpy( pb_now_vardata, (p_now_track->pb_now + 2), sz_size);
-                               pb_now_vardata  += sz_size;
-                               dw_now_varsize  += sz_size;
-                               p_now_track->pb_now     += (sz_size + 2);
+                               memcpy( pb_now_vardata, p_now_track->pb_now, sz_size);
+                               pb_now_vardata          += sz_size;
+                               dw_now_varsize          += sz_size;
+                               p_now_track->pb_now     += sz_size;
+
+                               p_now_event->dw_length  = sz_size;
+
                                //p_now_track->b_run_status     = 0x00;
                        }
                        else if( SMF_EVENT_META == *(p_now_track->pb_now) )     {
 
+                               /* Proc. 2Byte (MetaStatus(0xff) & MetaCode */
                                p_now_event->b_data[0]  = *(p_now_track->pb_now + 0);
                                p_now_event->b_data[1]  = *(p_now_track->pb_now + 1);
-                               p_now_event->b_data[2]  = *(p_now_track->pb_now + 2); /* size */
+
+                               /* Proc. Length */
+                               i_result        = DecodeValue( &dw_temp, (p_now_track->pb_now + 2) );
+                               sz_size         = (size_t)(dw_temp + i_result + 2);
+
                                p_now_event->dw_dataptr = dw_now_varsize;
-                               sz_size = (size_t)(p_now_event->b_data[2]) + 3;
                                memcpy( pb_now_vardata, p_now_track->pb_now, sz_size);
                                pb_now_vardata  += sz_size;
                                dw_now_varsize  += sz_size;
                                p_now_track->pb_now     += sz_size;
-                               //p_now_track->b_run_status     = 0x00;
+                               p_now_event->dw_length  = sz_size;
 
                                if( SMF_META_TRACKEND == p_now_event->b_data[1] )       {
                                        p_now_track->pb_now     = NULL;
@@ -415,6 +441,7 @@ int ReadSMFTrack(
                                        i_endtracks++;
                                }
                                
+                               //p_now_track->b_run_status     = 0x00;
                        }
 
                }
@@ -431,7 +458,7 @@ int ReadSMFTrack(
                        }
                }
                if( NULL != p_now_track->pb_now )       {
-                       i_result        = ReadDeltaTime( &dw_temp, p_now_track->pb_now );
+                       i_result        = DecodeValue( &dw_temp, p_now_track->pb_now );
                        p_now_track->dw_delta_now       = dw_temp;
                }
 
index 027e0e6..9dfcb13 100644 (file)
@@ -6,7 +6,7 @@
 #include"playumidi.h"
 
 /* ===================================================================*/
-int    EncodeDeltaTime(
+int    EncodeValue(
                Byte    *pb_value, 
                DWord   dw_delta )      {
 
@@ -91,7 +91,7 @@ int   Veryfy_Event(
                assert( NULL != p_track );
 
                /* Verify DeltaTime */
-               i_len   = EncodeDeltaTime( b_value, p_track->dw_delta_now );
+               i_len   = EncodeValue( b_value, p_track->dw_delta_now );
                if( 0 == i_len )        {
                        printf("Error!!: Fail Verify MidiEvent --"      \
                                                " [Trk %d] DeltaTime Length = 0\n",
@@ -101,7 +101,7 @@ int Veryfy_Event(
 
                i_result        = memcmp( b_value, p_track->pb_now, i_len );
                if( 0 != i_result )     {
-                       ReadDeltaTime( &dw_temp, p_track->pb_now );
+                       DecodeValue( &dw_temp, p_track->pb_now );
                        printf("Error!!: Fail Verify MidiEvent --"      \
                                                " [Trk %d] DeltaTime: Event:%d(%x %x %x %x) <=> MidiSrc:%d \n",
                                                i_track, i_len, b_value[0], b_value[1],
@@ -171,16 +171,23 @@ int       Veryfy_Event(
                        b_status        = p_mevent->b_data[0];
                        if( SMF_EVENT_SYSEX_F0 == b_status )    {
 
-                               b_value[0]      = p_mevent->b_data[0];          /* F0 */
-                               b_value[1]      = p_mevent->b_data[1];          /* Size (F0+data+F7) */
-                               i_len           = 2;
+                               /* Check 1Byte */
+                               if( p_mevent->b_data[0] != *p_track->pb_now )           {
+                                       printf("Error!!: Fail Verify MidiEvent --"      \
+                                               " [Trk %d] SysEx(F0) Status: Code:%x <=> MidiSrc:%ld \n",
+                                               i_track, p_mevent->b_data[0], (p_track->pb_data - p_track->pb_now) );
+                                       return 0x05;
+                               }
+                               p_track->pb_now++;
                                
+                               /* Check Length */
+                               i_len   = EncodeValue( b_value, (p_mevent->dw_length - 1) );
                                i_result        = memcmp( b_value, p_track->pb_now, i_len );
                                if( 0 != i_result )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
-                                               " [Trk %d] SysEx(F0) Status & Size: Code:%x %x <=> MidiSrc:%ld \n",
-                                               i_track, b_value[0], b_value[1],
-                                               (p_track->pb_data - p_track->pb_now) );
+                                               " [Trk %d] SysEx(F0) Size: Code:%d(%x %x %x %x)<=> MidiSrc:%ld \n",
+                                               i_track, p_mevent->dw_length, b_value[0], b_value[1], b_value[2],
+                                               b_value[3], (p_track->pb_data - p_track->pb_now) );
                                        return 0x05;
                                }
                                p_track->pb_now         +=  i_len;
@@ -192,39 +199,44 @@ int       Veryfy_Event(
                                        return 0x06;
                                }
 
-                               if( b_value[0] != *pb_temp )    {
+                               if( p_mevent->b_data[0] != *pb_temp )   {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
                                                " [Trk %d] SysEx(F0) Data: First Byte(%x,%x) \n",
-                                               i_track, b_value[0], *(p_track->pb_now) );
+                                               i_track, p_mevent->b_data[0], *(p_track->pb_now) );
                                        return 0x0f;
 
                                }
                                pb_temp++;
 
-                               i_len   = (int)b_value[1];
-                               i_result        = memcmp( pb_temp, p_track->pb_now, i_len );
+                               i_result        = memcmp( pb_temp, p_track->pb_now, p_mevent->dw_length - 1 );
                                if( 0 != i_result )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
                                                " [Trk %d] SysEx(F0) Data: len=%d \n", i_track, i_len );
                                        return 0x07;
                                }
                                        
-                               p_track->pb_now         += i_len;
-                               pb_vardata                      += (i_len + 1);
-
+                               p_track->pb_now         += (p_mevent->dw_length - 1);
+                               pb_vardata                      += p_mevent->dw_length;
 
                        } else if( SMF_EVENT_SYSEX_F7 == b_status )             {
 
-                               b_value[0]      = p_mevent->b_data[0];          /* F0 */
-                               b_value[1]      = p_mevent->b_data[1];          /* Size (data) */
-                               i_len           = 2;
+                               /* Check 1Byte */
+                               if( p_mevent->b_data[0] != *p_track->pb_now )           {
+                                       printf("Error!!: Fail Verify MidiEvent --"      \
+                                               " [Trk %d] SysEx(F7) Status: Code:%x <=> MidiSrc:%ld \n",
+                                               i_track, p_mevent->b_data[0], (p_track->pb_data - p_track->pb_now) );
+                                       return 0x08;
+                               }
+                               p_track->pb_now++;
                                
+                               /* Check Length */
+                               i_len   = EncodeValue( b_value, p_mevent->dw_length );
                                i_result        = memcmp( b_value, p_track->pb_now, i_len );
                                if( 0 != i_result )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
-                                               " [Trk %d] SysEx(F7) Status & Size: Code:%x %x <=> MidiSrc:%ld \n",
-                                               i_track, b_value[0], b_value[1],
-                                               (p_track->pb_data - p_track->pb_now) );
+                                               " [Trk %d] SysEx(F7) Size: Code:%d(%x %x %x %x)<=> MidiSrc:%ld \n",
+                                               i_track, p_mevent->dw_length, b_value[0], b_value[1], b_value[2],
+                                               b_value[3], (p_track->pb_data - p_track->pb_now) );
                                        return 0x08;
                                }
                                p_track->pb_now         +=  i_len;
@@ -233,54 +245,66 @@ int       Veryfy_Event(
                                if( pb_temp != pb_vardata )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
                                                " [Trk %d] SysEx(F7) VarData Ptr. Error \n", i_track );
-                                       return 0x09;
+                                       return 0x08;
                                }
 
-                               i_len   = (int)b_value[1];
-                               i_result        = memcmp( pb_temp, p_track->pb_now, i_len );
+                               i_result        = memcmp( pb_temp, p_track->pb_now, p_mevent->dw_length );
                                if( 0 != i_result )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
                                                " [Trk %d] SysEx(F7) Data: len=%d \n", i_track, i_len );
-                                       return 0x0a;
+                                       return 0x09;
                                }
                                        
-                               p_track->pb_now         += i_len;
-                               pb_vardata                      += i_len;
-
+                               p_track->pb_now         += p_mevent->dw_length;
+                               pb_vardata                      += p_mevent->dw_length;
 
                        } else if( SMF_EVENT_META == b_status )         {
 
-                               b_value[0]      = p_mevent->b_data[0];          /* F0 */
-                               b_value[1]      = p_mevent->b_data[1];          /* Meta Code */
-                               b_value[2]      = p_mevent->b_data[2];          /* Size */
-                               i_len           = 3;
-                               
-                               i_result        = memcmp( b_value, p_track->pb_now, i_len );
+                               /* Check 1Byte */
+                               if( p_mevent->b_data[0] != *(p_track->pb_now + 0) )             {
+                                       printf("Error!!: Fail Verify MidiEvent --"      \
+                                               " [Trk %d] Meta Status: Code:%x <=> MidiSrc:%x \n",
+                                               i_track, p_mevent->b_data[0], *p_track->pb_now );
+                                       return 0x08;
+                               }
+
+                               /* Check 2Byte */
+                               if( p_mevent->b_data[1] != *(p_track->pb_now + 1) )             {
+                                       printf("Error!!: Fail Verify MidiEvent --"      \
+                                               " [Trk %d] Meta Code: Code:%x <=> MidiSrc:%ld \n",
+                                               i_track, p_mevent->b_data[1], (p_track->pb_data - p_track->pb_now) );
+                                       return 0x08;
+                               }
+
+                               /* Check Length */
+                               i_len   = DecodeValue( &dw_temp, (p_track->pb_now + 2) );
+
+                               i_len   = EncodeValue( b_value, (p_mevent->dw_length - i_len - 2) );
+                               i_result        = memcmp( b_value, (p_track->pb_now + 2), i_len );
                                if( 0 != i_result )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
-                                               " [Trk %d] MetaCode Header: Code:%x %x %x <=> MidiSrc:%ld \n",
-                                               i_track, b_value[0], b_value[1], b_value[2],
-                                               (p_track->pb_data - p_track->pb_now) );
-                                       return 0x0b;
+                                               " [Trk %d] Meta Size: Code:%d(%x %x %x %x)<=> MidiSrc:%ld \n",
+                                               i_track, p_mevent->dw_length, b_value[0], b_value[1], b_value[2],
+                                               b_value[3], (p_track->pb_data - p_track->pb_now) );
+                                       return 0x08;
                                }
 
                                pb_temp = (pb_vartop + p_mevent->dw_dataptr);
                                if( pb_temp != pb_vardata )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
-                                               " [Trk %d] MetaCode VarData Ptr. Error \n", i_track );
-                                       return 0x0c;
+                                               " [Trk %d] Meta VarData Ptr. Error \n", i_track );
+                                       return 0x08;
                                }
 
-                               i_len   = (int)b_value[2] + 3;
-                               i_result        = memcmp( pb_temp, p_track->pb_now, i_len );
+                               i_result        = memcmp( pb_temp, p_track->pb_now, p_mevent->dw_length );
                                if( 0 != i_result )             {
                                        printf("Error!!: Fail Verify MidiEvent --"      \
-                                               " [Trk %d] MetaCode Data: len=%d \n", i_track, i_len );
-                                       return 0x0d;
+                                               " [Trk %d] Meta Data: len=%d \n", i_track, i_len );
+                                       return 0x09;
                                }
                                        
-                               p_track->pb_now         += i_len;
-                               pb_vardata                      += i_len;
+                               p_track->pb_now         += p_mevent->dw_length;
+                               pb_vardata                      += p_mevent->dw_length;
 
                        }
                }