SMRTRingToneConverter.c
上传用户:helaifa584
上传日期:2022-06-15
资源大小:29k
文件大小:26k
源码类别:

MTK

开发平台:

Objective-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_include.h"
  61. #if defined(__MMI_SMART_MESSAGE_MT__) || (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__))
  62. #include "SMRTRingToneConverter.h"
  63. #include "picmsgapitoothers.h"
  64. static const int smrt_bpm_encoding[] = {25, 28, 31, 35, 40, 45, 50, 56, 63, 70, 80, 90, 100,
  65.     112, 125, 140, 160, 180, 200, 225, 250, 285, 320, 355,
  66.     400, 450, 500, 565, 635, 715, 800, 900
  67. };
  68. /* --------------------------------------------------------------------------------------- */
  69. /* Start : JP for tracker Issue 178 : 20050602 */
  70. /* -----------------------------------Start - Defines-------------------------------------- */
  71. #define  OTA_VERSION    (0x30)
  72. #define BYTE         (8)
  73. #define  FOUR_BYTES     (4 * BYTE)
  74. /* -----------------------------------End - Defines-------------------------------------- */
  75. /* End : JP for tracker Issue 178 : 20050602 */
  76. /* ------------ Functions ----------------------------------------------------------- */
  77. U32 mmi_smrt_write_varlen(U32 value);
  78. void PlayAudioMidiStream(U8 *audioBuffer, U16 length, U8 style);
  79. /* ---------------------------------------------------------------------------------- */
  80. /*****************************************************************************
  81.  * FUNCTION
  82.  *  mmi_smrt_midi_handler
  83.  * DESCRIPTION
  84.  *  convert OTA Data to Midi format
  85.  *  
  86.  *  This is the main function of SMRT
  87.  * PARAMETERS
  88.  *  OTAdata                 [?]         
  89.  *  g_smrt_midiarray        [?]         
  90.  *  Midi(?)                 [OUT]       File pointer
  91.  *  OTA(?)                  [IN]        Data buffer
  92.  * RETURNS
  93.  *  TRUE : If it converts succesfully OTA to midi
  94.  *  FALSE: If not
  95.  *****************************************************************************/
  96. BOOL mmi_smrt_midi_handler(U8 *OTAdata, U8 *g_smrt_midiarray)
  97. {
  98.     /*----------------------------------------------------------------*/
  99.     /* Local Variables                                                */
  100.     /*----------------------------------------------------------------*/
  101.     U8 command_length, first_command, second_command, song_type;        /* commands */
  102.     U8 song_titlelength;        /* song title length */
  103.     U8 *song_title;             /* pointer to song name */
  104.     U8 song_sequence_length;    /* number of tracks */
  105.     U8 pattern_header;          /* song pattern header */
  106.     U8 pattern_id;              /* instruction ID */
  107.     U8 loop_value;              /* pattern repeatation rate */
  108.     U8 pattern_specifier;       /* number of pattern */
  109.     U32 midi_division_index;    /* index to midi_division in Midi file */
  110.     U32 midi_filelen_index;     /* index to file length in Midi file */
  111.     U32 pattern_data;           /* instruction ID decoding */
  112.     U32 tmp_count;              /* temporary counter */
  113.     U32 temp_note_duration;     /* temporary note duration variable */
  114.     U32 midi_division = 480;    /* default midi_tempo (delta time) */
  115.     U32 midi_tempo;             /* midi tempo */
  116.     U8 note_value;              /* note hex value */
  117.     U8 note_duration;           /* note duration */
  118.     U8 note_dur_specifier;      /* note duraion type */
  119.     U32 div_written = 1;        /* flag to saved the tempo in header */
  120.     U32 midi_scale = 2;         /* note scale */
  121.     U32 midi_style = 0;         /* play style */
  122.     U32 buffer;                 /* to be used with tempo */
  123.     U16 file_index = 0;         /* OTA file buffer index */
  124.     U32 midifilelength = 0;     /* length of midi file */
  125.     U32 g_smrt_index = 0;       /* midi file pointer */
  126.     /*----------------------------------------------------------------*/
  127.     /* Code Body                                                      */
  128.     /*----------------------------------------------------------------*/
  129.     // if(mmi_pmsg_string_search((S8*)RING_TONE_MELODY_SIGNATURE,(S8*)OTAdata)>=0)  /* For format other than Smart ringtone */
  130.     if (mmi_pmsg_string_search((S8*) "MELODY:", (S8*) OTAdata) >= 0)  /* For format other than Smart ringtone */
  131.     {
  132.         return FALSE;
  133.     }
  134. #if (0)
  135. /* under construction !*/
  136. #endif /* (0) */ 
  137.     /* Start : JP for tracker Issue 178 : 20050602 */
  138.     {
  139.         U8 tmp = 0;
  140.         tmp = *(OTAdata);
  141.         if (OTA_VERSION == tmp)
  142.         {
  143.             file_index += FOUR_BYTES;   /* !!! Hack : Skip 32 bits.May need to skip more bytes if text is present !!! */
  144.         }
  145.     }
  146.     /* End : JP for tracker Issue 178 : 20050602 */
  147.     command_length = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);       /* number of command */
  148.     file_index += 8;
  149.     if (command_length != 2)
  150.     {
  151.         return FALSE;
  152.     }
  153.     first_command = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);        /* get div_written command */
  154.     file_index += 8;
  155.     if (first_command != RINGTONEPROGRAMING_COMMAND)
  156.     {
  157.         return FALSE;
  158.     }
  159.     second_command = mmi_pmsg_get_n_bits(OTAdata, file_index, 7);       /* get second command */
  160.     file_index += 7;
  161.     if (second_command != SOUND_COMMAND)
  162.     {
  163.         return FALSE;
  164.     }
  165.     song_type = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);    /* get song type */
  166.     file_index += 3;    /* normally it comes as basic type (01) */
  167.     song_titlelength = mmi_pmsg_get_n_bits(OTAdata, file_index, 4);     /* get song title length */
  168.     file_index += 4;
  169.     if (song_titlelength)   /* if there is song name... retreive the same */
  170.     {                       /* allocate the memory */
  171.         song_title = (U8*) OslMalloc(sizeof(U8) * song_titlelength);
  172.         memset(song_title, '', sizeof(U8) * song_titlelength);
  173.         /* copy the song title in the array to be dumped in Midi later ON */
  174.         for (tmp_count = 0; tmp_count < song_titlelength; tmp_count++)
  175.         {
  176.             *(song_title + tmp_count) = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);
  177.             file_index += 8;
  178.         }
  179.     }
  180.     song_sequence_length = mmi_pmsg_get_n_bits(OTAdata, file_index, 8); /* number of songs */
  181.     file_index += 8;
  182.     pattern_header = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);       /* nth song */
  183.     file_index += 3;
  184.     pattern_id = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);   /* Pattern ID */
  185.     file_index += 2;
  186.     loop_value = mmi_pmsg_get_n_bits(OTAdata, file_index, 4);   /* Loop value */
  187.     file_index += 4;
  188.     pattern_specifier = mmi_pmsg_get_n_bits(OTAdata, file_index, 8);    /* number of instructions */
  189.     file_index += 8;
  190.     g_smrt_index = 0;   /* make index to zero to (start making the MIDI file) */
  191.     /* Header of Midi file (4 bytes) */
  192.     g_smrt_midiarray[g_smrt_index++] = 'M';
  193.     g_smrt_midiarray[g_smrt_index++] = 'T';
  194.     g_smrt_midiarray[g_smrt_index++] = 'h';
  195.     g_smrt_midiarray[g_smrt_index++] = 'd';
  196.     /* Length of Header (4 bytes). Note: length is always 6 bytes */
  197.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  198.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  199.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  200.     g_smrt_midiarray[g_smrt_index++] = 0x6;
  201.     // Format of Midi files (2 bytes). Note: 0 - single track, 1 - multiple tracks being played 
  202.     // simultaneously, 2 - multiple tracks played independently 
  203.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  204.     g_smrt_midiarray[g_smrt_index++] = 0x0; /* NOTE: default value of 0 */
  205.     /* number of tracks (2 bytes) */
  206.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  207.     g_smrt_midiarray[g_smrt_index++] = 0x1;
  208.     /* Division (2 bytes). This value represents delta time */
  209.     midi_division_index = g_smrt_index;         /* Saved to update the delta time from tempo later ON */
  210.     g_smrt_midiarray[g_smrt_index++] = 0x01;
  211.     g_smrt_midiarray[g_smrt_index++] = 0xE0;    /* NOTE: loaded default value of 125 BPM.will be changed later ON */
  212.     /* Track Header of Midi file (4 bytes) */
  213.     g_smrt_midiarray[g_smrt_index++] = 'M';
  214.     g_smrt_midiarray[g_smrt_index++] = 'T';
  215.     g_smrt_midiarray[g_smrt_index++] = 'r';
  216.     g_smrt_midiarray[g_smrt_index++] = 'k';
  217.     /* Length of track in bytes (4 bytes) */
  218.     midi_filelen_index = g_smrt_index;          /* saved to update later ON */
  219.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  220.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  221.     g_smrt_midiarray[g_smrt_index++] = 0x0;
  222.     g_smrt_midiarray[g_smrt_index++] = 0x77;    /* default value */
  223.     /* Write the song title. command is FF03 */
  224.     g_smrt_midiarray[g_smrt_index++] = 0x0;                 /* event delta time */
  225.     g_smrt_midiarray[g_smrt_index++] = 0xFF;                /* command for track title name (2 bytes) */
  226.     g_smrt_midiarray[g_smrt_index++] = 0x03;
  227.     g_smrt_midiarray[g_smrt_index++] = song_titlelength;    /* get the song title length */
  228.     for (tmp_count = 0; tmp_count < song_titlelength; tmp_count++)
  229.     {
  230.         g_smrt_midiarray[g_smrt_index++] = *(song_title + tmp_count);   /* copy the song title name */
  231.     }
  232.     OslMfree(song_title);   /* deallocate the memory sustained by song title. */
  233.     for (tmp_count = 0; tmp_count < pattern_specifier; tmp_count++)     /* get the Note, scale, style , tempo, vol variables */
  234.     {   /* 3 bits each */
  235.         pattern_data = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);
  236.         file_index += 3;
  237.         switch (pattern_data)
  238.         {
  239.             case 0: /* pattern ID. NOTE: Ignored if it comes in between */
  240.                 break;
  241.             case 1: /* Get Note pattern_data */
  242.                 note_value = mmi_pmsg_get_n_bits(OTAdata, file_index, 4);       /* Note Value */
  243.                 file_index += 4;
  244.                 note_duration = mmi_pmsg_get_n_bits(OTAdata, file_index, 3);    /* Note Duration */
  245.                 file_index += 3;
  246.                 note_dur_specifier = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);       /* Actual tone duration */
  247.                 file_index += 2;
  248.                 /* Calculate the note duration with tempo value, default is 480 */
  249.                 switch (note_duration)
  250.                 {
  251.                     case 0:
  252.                         temp_note_duration = midi_division * 4;
  253.                         break;  /* full note */
  254.                     case 1:
  255.                         temp_note_duration = midi_division * 2;
  256.                         break;  /* 1/2 note */
  257.                     case 2:
  258.                         temp_note_duration = midi_division;
  259.                         break;  /* 1/4 note */
  260.                     case 3:
  261.                         temp_note_duration = midi_division / 2;
  262.                         break;  /* 1/8 note */
  263.                     case 4:
  264.                         temp_note_duration = midi_division / 4;
  265.                         break;  /* 1/16 note */
  266.                     case 5:
  267.                         temp_note_duration = midi_division / 8;
  268.                         break;  /* 1/32 note */
  269.                     case 6: /* reserved */
  270.                     case 7: /* reserved */
  271.                     default:    /* default is 1/4 note */
  272.                         temp_note_duration = midi_division;
  273.                         break;
  274.                 }
  275.                 /* Actual Note duration considering the duration specifier */
  276.                 switch (note_dur_specifier)
  277.                 {
  278.                     case 0: /* No special duration */
  279.                         break;
  280.                     case 1: /* Dotted Note */
  281.                         temp_note_duration = (temp_note_duration * 3) / 2;
  282.                         break;
  283.                     case 2: /* Double dotted note */
  284.                         temp_note_duration = (temp_note_duration * 7) / 4;
  285.                         break;
  286.                     case 3: /* 2/3 length */
  287.                         temp_note_duration = (temp_note_duration * 2) / 3;
  288.                         break;
  289.                     default:    /* NO special duration */
  290.                         break;
  291.                 }
  292.                 /* Command for Note ON 90 */
  293.                 g_smrt_midiarray[g_smrt_index++] = 0x00;    /* delta event time */
  294.                 g_smrt_midiarray[g_smrt_index++] = 0x90;    /* note ON */
  295.                 if (note_value == 0)    /* Note value is Pause */
  296.                 {
  297.                     g_smrt_midiarray[g_smrt_index++] = 0x00;
  298.                 }
  299.                 else
  300.                 {   /* Have note values as per scale pattern_data. Only 4 octaves are considered */
  301.                     switch (midi_scale)
  302.                     {
  303.                         case 0: /* 440 Hz */
  304.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x29;
  305.                             break;
  306.                         case 1: /* 880 Hz */
  307.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x3B;
  308.                             break;
  309.                         case 2: /* 1.76 KHz */
  310.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  311.                             break;
  312.                         case 3: /* 3.52 KHz */
  313.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x53;
  314.                             break;
  315.                         default:    /* 1.76 KHz is taken as default */
  316.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  317.                             break;
  318.                     }
  319.                 }
  320.                 g_smrt_midiarray[g_smrt_index++] = 0x64;    /* velocity taken as default: 64 */
  321.                 /* Note ON duration is written as per style */
  322.                 switch (midi_style)
  323.                 {
  324.                     case 0: /* normal ON */
  325.                     case 1:
  326.                         /* currently not using any style as it creats problem with some sites */
  327.                 #if 0
  328. /* under construction !*/
  329. /* under construction !*/
  330. /* under construction !*/
  331. /* under construction !*/
  332. /* under construction !*/
  333. /* under construction !*/
  334. /* under construction !*/
  335. /* under construction !*/
  336. /* under construction !*/
  337. /* under construction !*/
  338. /* under construction !*/
  339. /* under construction !*/
  340. /* under construction !*/
  341. /* under construction !*/
  342. /* under construction !*/
  343. /* under construction !*/
  344.                 #endif /* 0 */ 
  345.                     case 2:     /* Staccato style currently taken as Normal */
  346.                         //            mmi_smrt_write_varlen(temp_note_duration);
  347.                         //            break;
  348.                     default:    /* Normal ON */
  349.                         buffer = mmi_smrt_write_varlen(temp_note_duration);
  350.                         while (1)
  351.                         {
  352.                             g_smrt_midiarray[g_smrt_index++] = (U8) buffer;
  353.                             if (buffer & 0x80)
  354.                             {
  355.                                 buffer >>= 8;
  356.                             }
  357.                             else
  358.                             {
  359.                                 break;
  360.                             }
  361.                         }
  362.                         break;
  363.                 }
  364.                 /* Command for Note OFF 80 */
  365.                 g_smrt_midiarray[g_smrt_index++] = 0x80;    /* note OFF */
  366.                 if (note_value == 0)    /* Pause Note */
  367.                 {
  368.                     g_smrt_midiarray[g_smrt_index++] = 0x00;
  369.                 }
  370.                 else
  371.                 {
  372.                     /* Have note values as per scale pattern_data. Only 4 octaves are considered */
  373.                     switch (midi_scale)
  374.                     {
  375.                         case 0: /* 440 Hz */
  376.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x29;
  377.                             break;
  378.                         case 1: /* 880 Hz */
  379.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x3B;
  380.                             break;
  381.                         case 2: /* 1.76 KHz */
  382.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  383.                             break;
  384.                         case 3: /* 3.52 KHz */
  385.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x53;
  386.                             break;
  387.                         default:    /* 1.76 KHz is taken as default */
  388.                             g_smrt_midiarray[g_smrt_index++] = note_value + 0x47;
  389.                             break;
  390.                     }
  391.                 }
  392.                 g_smrt_midiarray[g_smrt_index++] = 0x64;    /* Note velocity is taken as 64 default */
  393.                 break;
  394.             case 2: /* scale value */
  395.                 midi_scale = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);
  396.                 file_index += 2;
  397.                 break;
  398.             case 3: /* style value */
  399.                 midi_style = mmi_pmsg_get_n_bits(OTAdata, file_index, 2);
  400.                 file_index += 2;
  401.                 break;
  402.             case 4: /* tempo */
  403.                 midi_tempo = mmi_pmsg_get_n_bits(OTAdata, file_index, 5);
  404.                 file_index += 5;
  405.                 midi_tempo = smrt_bpm_encoding[midi_tempo];
  406.                 midi_tempo = (60 * 1000000) / midi_tempo;
  407.                 g_smrt_midiarray[g_smrt_index++] = 0x00;    /* event delta time */
  408.                 g_smrt_midiarray[g_smrt_index++] = 0xFF;    /* tempo (3 bytes) */
  409.                 g_smrt_midiarray[g_smrt_index++] = 0x51;
  410.                 g_smrt_midiarray[g_smrt_index++] = 0x03;
  411.                 g_smrt_midiarray[g_smrt_index++] = (U8) ((midi_tempo & 0xFF0000) >> 16);        /* div_written 0x07; */
  412.                 g_smrt_midiarray[g_smrt_index++] = (U8) ((midi_tempo & 0x00FF00) >> 8); /* second 0x53; */
  413.                 g_smrt_midiarray[g_smrt_index++] = (U8) (midi_tempo & 0x00FF);  /* third 00 */
  414.                 midi_tempo = midi_tempo / 1000; /* calculating the midi_division */
  415.                 if (div_written)
  416.                 {   /* update the divion at the start of Midi file */
  417.                     g_smrt_midiarray[midi_division_index++] = (U8) ((midi_tempo & 0xFF00) >> 8);
  418.                     g_smrt_midiarray[midi_division_index] = (U8) ((midi_tempo & 0x00FF));
  419.                     div_written = 0;
  420.                 }   /* else it is updated in between the midi file */
  421.                 break;
  422.             case 5: /* volume value is ignored */
  423.                 file_index += 4;
  424.                 break;
  425.             default:
  426.                 break;
  427.         }
  428.     }
  429.     /* Midi file end command */
  430.     g_smrt_midiarray[g_smrt_index++] = 0x00;    /* event delta time */
  431.     g_smrt_midiarray[g_smrt_index++] = 0xFF;    /* End of Midi file command (3 bytes) */
  432.     g_smrt_midiarray[g_smrt_index++] = 0x2F;
  433.     g_smrt_midiarray[g_smrt_index] = 0x00;
  434.     /* update the Midi file track length (4 bytes) */
  435.     midifilelength = g_smrt_index - MIDIHEADERLENGTH;
  436.     g_smrt_midiarray[midi_filelen_index++] = (U8) ((midifilelength & 0xFF000000) >> 24);
  437.     g_smrt_midiarray[midi_filelen_index++] = (U8) ((midifilelength & 0x00FF0000) >> 16);
  438.     g_smrt_midiarray[midi_filelen_index++] = (U8) ((midifilelength & 0x0000FF00) >> 8);
  439.     g_smrt_midiarray[midi_filelen_index] = (U8) ((midifilelength & 0x000000FF));
  440.     return 1;
  441. }
  442. /*****************************************************************************
  443.  * FUNCTION
  444.  *  mmi_smrt_write_varlen
  445.  * DESCRIPTION
  446.  *  convert the value in variable length as per midi format
  447.  * PARAMETERS
  448.  *  value           [IN]        To be converted into variable length
  449.  *  nothing(?)      [OUT]       
  450.  * RETURNS
  451.  *  variable length value
  452.  *****************************************************************************/
  453. U32 mmi_smrt_write_varlen(U32 value)
  454. {
  455.     /*----------------------------------------------------------------*/
  456.     /* Local Variables                                                */
  457.     /*----------------------------------------------------------------*/
  458.     U32 buffer;
  459.     /*----------------------------------------------------------------*/
  460.     /* Code Body                                                      */
  461.     /*----------------------------------------------------------------*/
  462.     buffer = value & 0x7F;
  463.     while ((value >>= 7))
  464.     {
  465.         buffer <<= 8;
  466.         buffer |= ((value & 0x7F) | 0x80);
  467.     }
  468.     return buffer;
  469. }
  470. /*****************************************************************************
  471.  * FUNCTION
  472.  *  mmi_smrt_midi_file_size
  473.  * DESCRIPTION
  474.  *  This return the total midi file size including the header.
  475.  *  In midi file only track length is taken into consideration
  476.  *  and not header. SO this function adds that track length + header
  477.  *  to give complete midi file size.
  478.  * PARAMETERS
  479.  *  midifile        [?]         
  480.  *  pointer(?)      [IN]        To midifile
  481.  *  nothing(?)      [OUT]       
  482.  * RETURNS
  483.  *  size fo file
  484.  *****************************************************************************/
  485. U32 mmi_smrt_midi_file_size(U8 *midifile)
  486. {
  487.     /*----------------------------------------------------------------*/
  488.     /* Local Variables                                                */
  489.     /*----------------------------------------------------------------*/
  490.     /* length of midi file will be from location 18 to 24. */
  491.     U32 midiFileLength;
  492.     /*----------------------------------------------------------------*/
  493.     /* Code Body                                                      */
  494.     /*----------------------------------------------------------------*/
  495.     midiFileLength = (midifile[MIDIFILELENGTHOFFSET] << 24);
  496.     midiFileLength = (midiFileLength | (midifile[MIDIFILELENGTHOFFSET + 1] << 16));
  497.     midiFileLength = (midiFileLength | (midifile[MIDIFILELENGTHOFFSET + 2] << 8));
  498.     midiFileLength = (midiFileLength | midifile[MIDIFILELENGTHOFFSET + 3]);
  499.     return (midiFileLength + MIDIHEADERLENGTH);
  500. }
  501. /*****************************************************************************
  502.  * FUNCTION
  503.  *  mmi_smrt_midi_track_name
  504.  * DESCRIPTION
  505.  *  This return pointer midi file track title.
  506.  *  
  507.  *  application should free this memory after computation
  508.  * PARAMETERS
  509.  *  midifile        [?]         
  510.  *  pointer(?)      [IN]        To midifile
  511.  *  nothing(?)      [OUT]       
  512.  * RETURNS
  513.  *  pointer to midi file track title.
  514.  *****************************************************************************/
  515. U8 *mmi_smrt_midi_track_name(U8 *midifile)
  516. {
  517.     /*----------------------------------------------------------------*/
  518.     /* Local Variables                                                */
  519.     /*----------------------------------------------------------------*/
  520.     U8 *trackTItle = NULL;
  521.     U8 titleLength, i;
  522.     /*----------------------------------------------------------------*/
  523.     /* Code Body                                                      */
  524.     /*----------------------------------------------------------------*/
  525.     titleLength = midifile[MIDITRACKTITLEOFFSET];
  526.     if (titleLength > 0)
  527.     {
  528.         trackTItle = (U8*) OslMalloc(titleLength + 1);
  529.         memset(trackTItle, '', titleLength + 1);
  530.         for (i = 0; i < titleLength; i++)
  531.         {
  532.             trackTItle[i] = midifile[MIDITRACKTITLEOFFSET + i];
  533.         }
  534.         trackTItle[++i] = '';
  535.     }
  536.     return trackTItle;
  537. }
  538. #endif /* defined(__MMI_SMART_MESSAGE_MT__) || (defined(__MMI_SMART_MESSAGE_MO__) && !defined(__MMI_MESSAGES_EMS__)) */ 
  539. /* ---------------------end of SMRTRingToneConverter.c-------------------------------------- */