SMRTRingToneConverter.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:26k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*******************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  * Midi.c
  40.  *
  41.  * Project:
  42.  * --------
  43.  *  MediaTeck GSM
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *  This Module defines the OTA to Midi file conversion.
  48.  *
  49.  * Author:
  50.  * -------
  51.  * -------
  52.  * -------
  53.  *             
  54.  *
  55.  * HISTORY
  56.  * -------
  57.  * Created On 16 September 2004
  58. *******************************************************************************/
  59. /* --------------------  Include files ------------------------------------------------ */
  60. #include "MMI_Features.h"
  61. #if defined(__MMI_SMART_MESSAGE_MT__) || (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__))
  62. #include "SMRTRingToneConverter.h"
  63. #include "pixteldatatypes.h"
  64. #include "GlobalDefs.h"
  65. #include "NVRAMEnum.h"
  66. #include "NVRAMType.h"
  67. #include "NVRAMProt.h"
  68. #include "picmsgapitoothers.h"
  69. #ifdef MMI_ON_HARDWARE_P
  70. #include "L4dr.h"
  71. #endif 
  72. #include "OslMemory.h"
  73. static const int smrt_bpm_encoding[] = {25, 28, 31, 35, 40, 45, 50, 56, 63, 70, 80, 90, 100,
  74.     112, 125, 140, 160, 180, 200, 225, 250, 285, 320, 355,
  75.     400, 450, 500, 565, 635, 715, 800, 900
  76. };
  77. /* --------------------------------------------------------------------------------------- */
  78. /* Start : JP for tracker Issue 178 : 20050602 */
  79. /* -----------------------------------Start - Defines-------------------------------------- */
  80. #define  OTA_VERSION    (0x30)
  81. #define BYTE         (8)
  82. #define  FOUR_BYTES     (4 * BYTE)
  83. /* -----------------------------------End - Defines-------------------------------------- */
  84. /* End : JP for tracker Issue 178 : 20050602 */
  85. /* ------------ Functions ----------------------------------------------------------- */
  86. U32 mmi_smrt_write_varlen(U32 value);
  87. void PlayAudioMidiStream(U8 *audioBuffer, U16 length, U8 style);
  88. /* ---------------------------------------------------------------------------------- */
  89. /*****************************************************************************
  90.  * FUNCTION
  91.  *  mmi_smrt_midi_handler
  92.  * DESCRIPTION
  93.  *  convert OTA Data to Midi format
  94.  *  
  95.  *  This is the main function of SMRT
  96.  * PARAMETERS
  97.  *  OTAdata                 [?]         
  98.  *  g_smrt_midiarray        [?]         
  99.  *  Midi(?)                 [OUT]       File pointer
  100.  *  OTA(?)                  [IN]        Data buffer
  101.  * RETURNS
  102.  *  TRUE : If it converts succesfully OTA to midi
  103.  *  FALSE: If not
  104.  *****************************************************************************/
  105. BOOL mmi_smrt_midi_handler(U8 *OTAdata, U8 *g_smrt_midiarray)
  106. {
  107.     /*----------------------------------------------------------------*/
  108.     /* Local Variables                                                */
  109.     /*----------------------------------------------------------------*/
  110.     U8 command_length, first_command, second_command, song_type;        /* commands */
  111.     U8 song_titlelength;        /* song title length */
  112.     U8 *song_title;             /* pointer to song name */
  113.     U8 song_sequence_length;    /* number of tracks */
  114.     U8 pattern_header;          /* song pattern header */
  115.     U8 pattern_id;              /* instruction ID */
  116.     U8 loop_value;              /* pattern repeatation rate */
  117.     U8 pattern_specifier;       /* number of pattern */
  118.     U32 midi_division_index;    /* index to midi_division in Midi file */
  119.     U32 midi_filelen_index;     /* index to file length in Midi file */
  120.     U32 pattern_data;           /* instruction ID decoding */
  121.     U32 tmp_count;              /* temporary counter */
  122.     U32 temp_note_duration;     /* temporary note duration variable */
  123.     U32 midi_division = 480;    /* default midi_tempo (delta time) */
  124.     U32 midi_tempo;             /* midi tempo */
  125.     U8 note_value;              /* note hex value */
  126.     U8 note_duration;           /* note duration */
  127.     U8 note_dur_specifier;      /* note duraion type */
  128.     U32 div_written = 1;        /* flag to saved the tempo in header */
  129.     U32 midi_scale = 2;         /* note scale */
  130.     U32 midi_style = 0;         /* play style */
  131.     U32 buffer;                 /* to be used with tempo */
  132.     U16 file_index = 0;         /* OTA file buffer index */
  133.     U32 midifilelength = 0;     /* length of midi file */
  134.     U32 g_smrt_index = 0;       /* midi file pointer */
  135.     /*----------------------------------------------------------------*/
  136.     /* Code Body                                                      */
  137.     /*----------------------------------------------------------------*/
  138.     // if(mmi_pmsg_string_search((S8*)RING_TONE_MELODY_SIGNATURE,(S8*)OTAdata)>=0)  /* For format other than Smart ringtone */
  139.     if (mmi_pmsg_string_search((S8*) "MELODY:", (S8*) OTAdata) >= 0)  /* For format other than Smart ringtone */
  140.     {
  141.         return FALSE;
  142.     }
  143. #if (0)
  144. /* under construction !*/
  145. #endif /* (0) */ 
  146.     /* Start : JP for tracker Issue 178 : 20050602 */
  147.     {
  148.         U8 tmp = 0;
  149.         tmp = *(OTAdata);
  150.         if (OTA_VERSION == tmp)
  151.         {
  152.             file_index += FOUR_BYTES;   /* !!! Hack : Skip 32 bits.May need to skip more bytes if text is present !!! */
  153.         }
  154.     }
  155.     /* End : JP for tracker Issue 178 : 20050602 */
  156.     command_length = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);       /* number of command */
  157.     file_index += 8;
  158.     if (command_length != 2)
  159.     {
  160.         return FALSE;
  161.     }
  162.     first_command = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);        /* get div_written command */
  163.     file_index += 8;
  164.     if (first_command != RINGTONEPROGRAMING_COMMAND)
  165.     {
  166.         return FALSE;
  167.     }
  168.     second_command = mmi_pmsg_get_n_bits(OTAdata, file_index, 7);       /* get second command */
  169.     file_index += 7;
  170.     if (second_command != SOUND_COMMAND)
  171.     {
  172.         return FALSE;
  173.     }
  174.     song_type = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);    /* get song type */
  175.     file_index += 3;    /* normally it comes as basic type (01) */
  176.     song_titlelength = mmi_pmsg_get_n_bits(OTAdata, file_index, 4);     /* get song title length */
  177.     file_index += 4;
  178.     if (song_titlelength)   /* if there is song name... retreive the same */
  179.     {                       /* allocate the memory */
  180.         song_title = (U8*) OslMalloc(sizeof(U8) * song_titlelength);
  181.         memset(song_title, '', sizeof(U8) * song_titlelength);
  182.         /* copy the song title in the array to be dumped in Midi later ON */
  183.         for (tmp_count = 0; tmp_count < song_titlelength; tmp_count++)
  184.         {
  185.             *(song_title + tmp_count) = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);
  186.             file_index += 8;
  187.         }
  188.     }
  189.     song_sequence_length = mmi_pmsg_get_n_bits(OTAdata, file_index, 8); /* number of songs */
  190.     file_index += 8;
  191.     pattern_header = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);       /* nth song */
  192.     file_index += 3;
  193.     pattern_id = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);   /* Pattern ID */
  194.     file_index += 2;
  195.     loop_value = mmi_pmsg_get_n_bits(OTAdata, file_index, 4);   /* Loop value */
  196.     file_index += 4;
  197.     pattern_specifier = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);    /* number of instructions */
  198.     file_index += 8;
  199.     g_smrt_index = 0;   /* make index to zero to (start making the MIDI file) */
  200.     /* Header of Midi file (4 bytes) */
  201.     g_smrt_midiarray[g_smrt_index++] = 'M';
  202.     g_smrt_midiarray[g_smrt_index++] = 'T';
  203.     g_smrt_midiarray[g_smrt_index++] = 'h';
  204.     g_smrt_midiarray[g_smrt_index++] = 'd';
  205.     /* Length of Header (4 bytes). Note: length is always 6 bytes */
  206.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  207.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  208.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  209.     g_smrt_midiarray[g_smrt_index++] = 0x6;
  210.     // Format of Midi files (2 bytes). Note: 0 - single track, 1 - multiple tracks being played 
  211.     // simultaneously, 2 - multiple tracks played independently 
  212.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  213.     g_smrt_midiarray[g_smrt_index++] = 0x0; /* NOTE: default value of 0 */
  214.     /* number of tracks (2 bytes) */
  215.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  216.     g_smrt_midiarray[g_smrt_index++] = 0x1;
  217.     /* Division (2 bytes). This value represents delta time */
  218.     midi_division_index = g_smrt_index;         /* Saved to update the delta time from tempo later ON */
  219.     g_smrt_midiarray[g_smrt_index++] = 0x01;
  220.     g_smrt_midiarray[g_smrt_index++] = 0xE0;    /* NOTE: loaded default value of 125 BPM.will be changed later ON */
  221.     /* Track Header of Midi file (4 bytes) */
  222.     g_smrt_midiarray[g_smrt_index++] = 'M';
  223.     g_smrt_midiarray[g_smrt_index++] = 'T';
  224.     g_smrt_midiarray[g_smrt_index++] = 'r';
  225.     g_smrt_midiarray[g_smrt_index++] = 'k';
  226.     /* Length of track in bytes (4 bytes) */
  227.     midi_filelen_index = g_smrt_index;          /* saved to update later ON */
  228.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  229.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  230.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  231.     g_smrt_midiarray[g_smrt_index++] = 0x77;    /* default value */
  232.     /* Write the song title. command is FF03 */
  233.     g_smrt_midiarray[g_smrt_index++] = 0x0;                 /* event delta time */
  234.     g_smrt_midiarray[g_smrt_index++] = 0xFF;                /* command for track title name (2 bytes) */
  235.     g_smrt_midiarray[g_smrt_index++] = 0x03;
  236.     g_smrt_midiarray[g_smrt_index++] = song_titlelength;    /* get the song title length */
  237.     for (tmp_count = 0; tmp_count < song_titlelength; tmp_count++)
  238.     {
  239.         g_smrt_midiarray[g_smrt_index++] = *(song_title + tmp_count);   /* copy the song title name */
  240.     }
  241.     OslMfree(song_title);   /* deallocate the memory sustained by song title. */
  242.     for (tmp_count = 0; tmp_count < pattern_specifier; tmp_count++)     /* get the Note, scale, style , tempo, vol variables */
  243.     {   /* 3 bits each */
  244.         pattern_data = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);
  245.         file_index += 3;
  246.         switch (pattern_data)
  247.         {
  248.             case 0: /* pattern ID. NOTE: Ignored if it comes in between */
  249.                 break;
  250.             case 1: /* Get Note pattern_data */
  251.                 note_value = mmi_pmsg_get_n_bits(OTAdata, file_index, 4);       /* Note Value */
  252.                 file_index += 4;
  253.                 note_duration = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);    /* Note Duration */
  254.                 file_index += 3;
  255.                 note_dur_specifier = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);       /* Actual tone duration */
  256.                 file_index += 2;
  257.                 /* Calculate the note duration with tempo value, default is 480 */
  258.                 switch (note_duration)
  259.                 {
  260.                     case 0:
  261.                         temp_note_duration = midi_division * 4;
  262.                         break;  /* full note */
  263.                     case 1:
  264.                         temp_note_duration = midi_division * 2;
  265.                         break;  /* 1/2 note */
  266.                     case 2:
  267.                         temp_note_duration = midi_division;
  268.                         break;  /* 1/4 note */
  269.                     case 3:
  270.                         temp_note_duration = midi_division / 2;
  271.                         break;  /* 1/8 note */
  272.                     case 4:
  273.                         temp_note_duration = midi_division / 4;
  274.                         break;  /* 1/16 note */
  275.                     case 5:
  276.                         temp_note_duration = midi_division / 8;
  277.                         break;  /* 1/32 note */
  278.                     case 6: /* reserved */
  279.                     case 7: /* reserved */
  280.                     default:    /* default is 1/4 note */
  281.                         temp_note_duration = midi_division;
  282.                         break;
  283.                 }
  284.                 /* Actual Note duration considering the duration specifier */
  285.                 switch (note_dur_specifier)
  286.                 {
  287.                     case 0: /* No special duration */
  288.                         break;
  289.                     case 1: /* Dotted Note */
  290.                         temp_note_duration = (temp_note_duration * 3) / 2;
  291.                         break;
  292.                     case 2: /* Double dotted note */
  293.                         temp_note_duration = (temp_note_duration * 7) / 4;
  294.                         break;
  295.                     case 3: /* 2/3 length */
  296.                         temp_note_duration = (temp_note_duration * 2) / 3;
  297.                         break;
  298.                     default:    /* NO special duration */
  299.                         break;
  300.                 }
  301.                 /* Command for Note ON 90 */
  302.                 g_smrt_midiarray[g_smrt_index++] = 0x00;    /* delta event time */
  303.                 g_smrt_midiarray[g_smrt_index++] = 0x90;    /* note ON */
  304.                 if (note_value == 0)    /* Note value is Pause */
  305.                 {
  306.                     g_smrt_midiarray[g_smrt_index++] = 0x00;
  307.                 }
  308.                 else
  309.                 {   /* Have note values as per scale pattern_data. Only 4 octaves are considered */
  310.                     switch (midi_scale)
  311.                     {
  312.                         case 0: /* 440 Hz */
  313.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x29;
  314.                             break;
  315.                         case 1: /* 880 Hz */
  316.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x3B;
  317.                             break;
  318.                         case 2: /* 1.76 KHz */
  319.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  320.                             break;
  321.                         case 3: /* 3.52 KHz */
  322.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x53;
  323.                             break;
  324.                         default:    /* 1.76 KHz is taken as default */
  325.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  326.                             break;
  327.                     }
  328.                 }
  329.                 g_smrt_midiarray[g_smrt_index++] = 0x64;    /* velocity taken as default: 64 */
  330.                 /* Note ON duration is written as per style */
  331.                 switch (midi_style)
  332.                 {
  333.                     case 0: /* normal ON */
  334.                     case 1:
  335.                         /* currently not using any style as it creats problem with some sites */
  336.                 #if 0
  337. /* under construction !*/
  338. /* under construction !*/
  339. /* under construction !*/
  340. /* under construction !*/
  341. /* under construction !*/
  342. /* under construction !*/
  343. /* under construction !*/
  344. /* under construction !*/
  345. /* under construction !*/
  346. /* under construction !*/
  347. /* under construction !*/
  348. /* under construction !*/
  349. /* under construction !*/
  350. /* under construction !*/
  351. /* under construction !*/
  352. /* under construction !*/
  353.                 #endif /* 0 */ 
  354.                     case 2:     /* Staccato style currently taken as Normal */
  355.                         //            mmi_smrt_write_varlen(temp_note_duration);
  356.                         //            break;
  357.                     default:    /* Normal ON */
  358.                         buffer = mmi_smrt_write_varlen(temp_note_duration);
  359.                         while (1)
  360.                         {
  361.                             g_smrt_midiarray[g_smrt_index++] = (U8) buffer;
  362.                             if (buffer & 0x80)
  363.                             {
  364.                                 buffer >>= 8;
  365.                             }
  366.                             else
  367.                             {
  368.                                 break;
  369.                             }
  370.                         }
  371.                         break;
  372.                 }
  373.                 /* Command for Note OFF 80 */
  374.                 g_smrt_midiarray[g_smrt_index++] = 0x80;    /* note OFF */
  375.                 if (note_value == 0)    /* Pause Note */
  376.                 {
  377.                     g_smrt_midiarray[g_smrt_index++] = 0x00;
  378.                 }
  379.                 else
  380.                 {
  381.                     /* Have note values as per scale pattern_data. Only 4 octaves are considered */
  382.                     switch (midi_scale)
  383.                     {
  384.                         case 0: /* 440 Hz */
  385.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x29;
  386.                             break;
  387.                         case 1: /* 880 Hz */
  388.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x3B;
  389.                             break;
  390.                         case 2: /* 1.76 KHz */
  391.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  392.                             break;
  393.                         case 3: /* 3.52 KHz */
  394.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x53;
  395.                             break;
  396.                         default:    /* 1.76 KHz is taken as default */
  397.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  398.                             break;
  399.                     }
  400.                 }
  401.                 g_smrt_midiarray[g_smrt_index++] = 0x64;    /* Note velocity is taken as 64 default */
  402.                 break;
  403.             case 2: /* scale value */
  404.                 midi_scale = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);
  405.                 file_index += 2;
  406.                 break;
  407.             case 3: /* style value */
  408.                 midi_style = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);
  409.                 file_index += 2;
  410.                 break;
  411.             case 4: /* tempo */
  412.                 midi_tempo = mmi_pmsg_get_n_bits(OTAdata, file_index, 5);
  413.                 file_index += 5;
  414.                 midi_tempo = smrt_bpm_encoding[midi_tempo];
  415.                 midi_tempo = (60 * 1000000) / midi_tempo;
  416.                 g_smrt_midiarray[g_smrt_index++] = 0x00;    /* event delta time */
  417.                 g_smrt_midiarray[g_smrt_index++] = 0xFF;    /* tempo (3 bytes) */
  418.                 g_smrt_midiarray[g_smrt_index++] = 0x51;
  419.                 g_smrt_midiarray[g_smrt_index++] = 0x03;
  420.                 g_smrt_midiarray[g_smrt_index++] = (U8) ((midi_tempo & 0xFF0000) >> 16);        /* div_written 0x07; */
  421.                 g_smrt_midiarray[g_smrt_index++] = (U8) ((midi_tempo & 0x00FF00) >> 8); /* second 0x53; */
  422.                 g_smrt_midiarray[g_smrt_index++] = (U8) (midi_tempo & 0x00FF);  /* third 00 */
  423.                 midi_tempo = midi_tempo / 1000; /* calculating the midi_division */
  424.                 if (div_written)
  425.                 {   /* update the divion at the start of Midi file */
  426.                     g_smrt_midiarray[midi_division_index++] = (U8) ((midi_tempo & 0xFF00) >> 8);
  427.                     g_smrt_midiarray[midi_division_index] = (U8) ((midi_tempo & 0x00FF));
  428.                     div_written = 0;
  429.                 }   /* else it is updated in between the midi file */
  430.                 break;
  431.             case 5: /* volume value is ignored */
  432.                 file_index += 4;
  433.                 break;
  434.             default:
  435.                 break;
  436.         }
  437.     }
  438.     /* Midi file end command */
  439.     g_smrt_midiarray[g_smrt_index++] = 0x00;    /* event delta time */
  440.     g_smrt_midiarray[g_smrt_index++] = 0xFF;    /* End of Midi file command (3 bytes) */
  441.     g_smrt_midiarray[g_smrt_index++] = 0x2F;
  442.     g_smrt_midiarray[g_smrt_index] = 0x00;
  443.     /* update the Midi file track length (4 bytes) */
  444.     midifilelength = g_smrt_index - MIDIHEADERLENGTH;
  445.     g_smrt_midiarray[midi_filelen_index++] = (U8) ((midifilelength & 0xFF000000) >> 24);
  446.     g_smrt_midiarray[midi_filelen_index++] = (U8) ((midifilelength & 0x00FF0000) >> 16);
  447.     g_smrt_midiarray[midi_filelen_index++] = (U8) ((midifilelength & 0x0000FF00) >> 8);
  448.     g_smrt_midiarray[midi_filelen_index] = (U8) ((midifilelength & 0x000000FF));
  449.     return 1;
  450. }
  451. /*****************************************************************************
  452.  * FUNCTION
  453.  *  mmi_smrt_write_varlen
  454.  * DESCRIPTION
  455.  *  convert the value in variable length as per midi format
  456.  * PARAMETERS
  457.  *  value           [IN]        To be converted into variable length
  458.  *  nothing(?)      [OUT]       
  459.  * RETURNS
  460.  *  variable length value
  461.  *****************************************************************************/
  462. U32 mmi_smrt_write_varlen(U32 value)
  463. {
  464.     /*----------------------------------------------------------------*/
  465.     /* Local Variables                                                */
  466.     /*----------------------------------------------------------------*/
  467.     U32 buffer;
  468.     /*----------------------------------------------------------------*/
  469.     /* Code Body                                                      */
  470.     /*----------------------------------------------------------------*/
  471.     buffer = value & 0x7F;
  472.     while ((value >>= 7))
  473.     {
  474.         buffer <<= 8;
  475.         buffer |= ((value & 0x7F) | 0x80);
  476.     }
  477.     return buffer;
  478. }
  479. /*****************************************************************************
  480.  * FUNCTION
  481.  *  mmi_smrt_midi_file_size
  482.  * DESCRIPTION
  483.  *  This return the total midi file size including the header.
  484.  *  In midi file only track length is taken into consideration
  485.  *  and not header. SO this function adds that track length + header
  486.  *  to give complete midi file size.
  487.  * PARAMETERS
  488.  *  midifile        [?]         
  489.  *  pointer(?)      [IN]        To midifile
  490.  *  nothing(?)      [OUT]       
  491.  * RETURNS
  492.  *  size fo file
  493.  *****************************************************************************/
  494. U32 mmi_smrt_midi_file_size(U8 *midifile)
  495. {
  496.     /*----------------------------------------------------------------*/
  497.     /* Local Variables                                                */
  498.     /*----------------------------------------------------------------*/
  499.     /* length of midi file will be from location 18 to 24. */
  500.     U32 midiFileLength;
  501.     /*----------------------------------------------------------------*/
  502.     /* Code Body                                                      */
  503.     /*----------------------------------------------------------------*/
  504.     midiFileLength = (midifile[MIDIFILELENGTHOFFSET] << 24);
  505.     midiFileLength = (midiFileLength | (midifile[MIDIFILELENGTHOFFSET + 1] << 16));
  506.     midiFileLength = (midiFileLength | (midifile[MIDIFILELENGTHOFFSET + 2] << 8));
  507.     midiFileLength = (midiFileLength | midifile[MIDIFILELENGTHOFFSET + 3]);
  508.     return (midiFileLength + MIDIHEADERLENGTH);
  509. }
  510. /*****************************************************************************
  511.  * FUNCTION
  512.  *  mmi_smrt_midi_track_name
  513.  * DESCRIPTION
  514.  *  This return pointer midi file track title.
  515.  *  
  516.  *  application should free this memory after computation
  517.  * PARAMETERS
  518.  *  midifile        [?]         
  519.  *  pointer(?)      [IN]        To midifile
  520.  *  nothing(?)      [OUT]       
  521.  * RETURNS
  522.  *  pointer to midi file track title.
  523.  *****************************************************************************/
  524. U8 *mmi_smrt_midi_track_name(U8 *midifile)
  525. {
  526.     /*----------------------------------------------------------------*/
  527.     /* Local Variables                                                */
  528.     /*----------------------------------------------------------------*/
  529.     U8 *trackTItle = NULL;
  530.     U8 titleLength, i;
  531.     /*----------------------------------------------------------------*/
  532.     /* Code Body                                                      */
  533.     /*----------------------------------------------------------------*/
  534.     titleLength = midifile[MIDITRACKTITLEOFFSET];
  535.     if (titleLength > 0)
  536.     {
  537.         trackTItle = (U8*) OslMalloc(titleLength + 1);
  538.         memset(trackTItle, '', titleLength + 1);
  539.         for (i = 0; i < titleLength; i++)
  540.         {
  541.             trackTItle[i] = midifile[MIDITRACKTITLEOFFSET + i];
  542.         }
  543.         trackTItle[++i] = '';
  544.     }
  545.     return trackTItle;
  546. }
  547. #endif /* defined(__MMI_SMART_MESSAGE_MT__) || (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__)) */ 
  548. /* ---------------------end of SMRTRingToneConverter.c-------------------------------------- */