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 + -
显示快捷键?