sfamp3.almp3.c

来自「SEAL是DOS 下的32位保护模式的GUI程序」· C语言 代码 · 共 516 行 · 第 1/2 页

C
516
字号
}

l_bool mp3_forward_file(p_soundformat_item o, l_int relpos)
{
   MP3_DATA *mp3_data;
   int pos;

   mp3_data = (MP3_DATA *) o->extra;

   if (mp3_data->loaded == FALSE)
      return(FALSE);

   pos = almp3_seek_rel_secs_mp3stream(mp3_data->s, relpos, file_size(mp3_data->filename));
   pack_fseek(mp3_data->f, pos);

   return(TRUE);
}

l_bool mp3_rewind_file(p_soundformat_item o, l_int relpos)
{
   MP3_DATA *mp3_data;
   int pos;

   mp3_data = (MP3_DATA *) o->extra;

   if (mp3_data->loaded == FALSE)
      return(FALSE);

   pos = almp3_seek_rel_secs_mp3stream(mp3_data->s, -relpos, file_size(mp3_data->filename));
   pack_fseek(mp3_data->f, pos);

   return(TRUE);
}

l_bool mp3_set_pos(p_soundformat_item o, l_int pos)
{
   MP3_DATA *mp3_data;
   int seek_pos;

   mp3_data = (MP3_DATA *) o->extra;

   if (mp3_data->loaded == FALSE)
      return(FALSE);

   seek_pos = almp3_seek_abs_secs_mp3stream(mp3_data->s, pos, file_size(mp3_data->filename));
   pack_fseek(mp3_data->f, pos);

   return(TRUE);
}

l_int mp3_get_pos(p_soundformat_item o)
{
   MP3_DATA *mp3_data;

   mp3_data = (MP3_DATA *) o->extra;
   return(almp3_get_pos_secs_mp3stream(mp3_data->s));
}

l_int mp3_get_len_file(p_soundformat_item o)
{
   MP3_DATA *mp3_data;

   mp3_data = (MP3_DATA *) o->extra;
   return(almp3_get_length_secs_mp3stream(mp3_data->s, file_size(mp3_data->filename)));
}

l_bool mp3_get_file_info(p_soundformat_item o, SFAINFO *inf)
{
   char title[31], author[31], album[35];
   unsigned char comment[31];
   char *genre = 0;
   char *buf;

   MP3_DATA *mp3_data;

   FILE *f;
   char buffer[128];
   long ret;

   mp3_data = (MP3_DATA *) o->extra;

   title[0] = 0;
   author[0] = 0;
   album[0] = 0;
   comment[0] = 0;
   genre = "\0";

   f = fopen(mp3_data->filename, "rb");

   if (!f)
      goto get_other_info;

   fseek(f, -128, SEEK_END);
   fread(buffer, 128, 1, f);
   ret = ftell(f);
  
   if (buffer[0] == 'T' && buffer[1] == 'A' && buffer[2] == 'G')
   {
      unsigned char genre_id = buffer[127];

      memcpy(title, buffer + 3,30);
      title[30] = 0;

      memcpy(author, buffer + 33,30);
      author[30] = 0;

      memcpy(album, buffer + 63, 34); // Plus year
      album[34] = 0;

      memcpy(comment, buffer + 97, 30);
      comment[30] = 0;

      if (genre_id >= maxKnownGenre)
         genre = TXT_UNSPECIFIED;
      else
         genre = GenreStr[genre_id];
   }

   fclose(f);

get_other_info: ;

   inf->freq = almp3_get_wave_freq_mp3stream(mp3_data->s);
   inf->bits = almp3_get_wave_bits_mp3stream(mp3_data->s);
   inf->channels = almp3_get_wave_is_stereo_mp3stream(mp3_data->s) == TRUE ? 2 : 1;
   inf->bitrate = almp3_get_bitrate_mp3stream(mp3_data->s) / 1000;

   strcpy(inf->title, title);
   strcpy(inf->album, album);
   strcpy(inf->author, author);
   strcpy(inf->comment, comment);
   strcpy(inf->genre, genre);

   return(TRUE);
}

l_text mp3_get_friendly_name(p_soundformat_item o)
{
   SFAINFO inf;
   MP3_DATA *mp3_data;

   mp3_data = (MP3_DATA *) o->extra;
   mp3_get_file_info(o, &inf);

   if (inf.title != NULL && inf.author != NULL)
      return(set_format_text(NULL, "%s - %s", inf.author, inf.title));
   else
      return(_strdup(mp3_data->filename));
}

l_bool mp3_config_driver(p_soundformat_item o)
{
   return(mp3_display_about(o));
}

l_bool mp3_display_about(p_soundformat_item o)
{
   msgbox(MW_INFO, MB_OK, "MP3 Driver for SFA\nVersion 1.1\n\nCopyright \xA9 Florian Xaver 2000\nCopyright \xA9 Owen Rudge 2001-2002\n\nUses AllegroMP3 plus some code from GEMP3\n(www.owenrudge.co.uk/GEM/)");
   return(0);
}

l_bool mp3_close_file(p_soundformat_item o)
{
   MP3_DATA *mp3_data;

   mp3_data = (MP3_DATA *) o->extra;

   pack_fclose(mp3_data->f);
   almp3_destroy_mp3stream(mp3_data->s);

   free(o->extra);

   return(TRUE);
}

l_bool mp3_terminate_driver(p_soundformat_item o)
{
   return(TRUE);
}

//lib_exportable;
#include "sfamp3.exp"

SetInfoAppName("MP3 Driver");
SetInfoDesciption("MP3 Driver for SFA");
SetInfoCopyright("Copyright (c) Florian Xaver 2000, Owen Rudge 2001-2002");
SetInfoManufacturer("Florian Xaver, Owen Rudge");

lib_begin (void)
{
   if (ap_process == AP_ALLOC)
      AP_EXPORTLIB();

   if (ap_process == AP_INIT)
   {
      p_soundformat_item k, k2;

      AP_EXPORTLIB();

      k = new_soundformat_item(                      ("mp3"),
                                                     ("MP3 files"),
                                                     ("Copyright (c) Florian Xaver 2000, Owen Rudge 2001-2002"),
                                                     &mp3_init_driver,
                                                     &mp3_init_file,
                                                     &mp3_play_file,
                                                     &mp3_poll_file,
                                                     &mp3_stop_file,
                                                     &mp3_pause_file,
                                                     &mp3_forward_file,
                                                     &mp3_rewind_file,
                                                     &mp3_set_pos,
                                                     &mp3_get_pos,
                                                     &mp3_get_len_file,
                                                     &mp3_get_file_info,
                                                     &mp3_get_friendly_name,
                                                     &mp3_config_driver,
                                                     &mp3_display_about,
                                                     &mp3_close_file,
                                                     &mp3_terminate_driver
                                                     );

      k2 = new_soundformat_item(                     ("mp2"),
                                                     ("MP2 files"),
                                                     ("Copyright (c) Florian Xaver 2000, Owen Rudge 2001"),
                                                     &mp3_init_driver,
                                                     &mp3_init_file,
                                                     &mp3_play_file,
                                                     &mp3_poll_file,
                                                     &mp3_stop_file,
                                                     &mp3_pause_file,
                                                     &mp3_forward_file,
                                                     &mp3_rewind_file,
                                                     &mp3_set_pos,
                                                     &mp3_get_pos,
                                                     &mp3_get_len_file,
                                                     &mp3_get_file_info,
                                                     &mp3_get_friendly_name,
                                                     &mp3_config_driver,
                                                     &mp3_display_about,
                                                     &mp3_close_file,
                                                     &mp3_terminate_driver
                                                     );

      sound_format_list->insert(sound_format_list, k);
      sound_format_list->insert(sound_format_list, k2);
   }

   if (ap_process == AP_DONE)
   {

   }

   if (ap_process == AP_FREE)
   {

   }
} lib_end;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?