📄 sfamp3.almp3.c
字号:
/******************************************************************
* SEAL 2.0 *
* Copyright (c) 1999-2002 SEAL Developers. All Rights Reserved. *
* *
* Web site: http://sealsystem.sourceforge.net/ *
* E-mail (current maintainer): orudge@users.sourceforge.net *
******************************************************************/
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/***************************************/ // THIS VERSION IS BUGGY!
/* MP3 driver for SFA */
/* Copyright (c) Florian Xaver 2000 */
/* Copyright (c) Owen Rudge 2001-2002 */
/* */
/* Uses code from GEMP3. Please see */
/* http://www.owenrudge.co.uk/GEM/ */
/* for more information. */
/***************************************/
/* Revision History:
*
* 16/09/2001: Added MP2 file extension support and updated new_soundformat_item call. Also
* added ID3 support. (orudge)
*
* 04/10/2001: Added about box (orudge)
*
* 10/11/2001: Revamped driver for new SFA version. Tidied up code, etc. (orudge)
*
* 02/04/2002: Used AllegroMP3 instead of LibAmp (orudge)
*/
#include <stdio.h>
#include <seal.h>
#include <sound.h>
#include <dialogs.h>
#include <almp3.h>
#define TXT_UNSPECIFIED INI_TEXT("Unspecified")
#define TXT_ERROR_UNABLE_OPEN INI_TEXT("Unable to open MP3.")
#define TXT_ERROR_UNABLE_READ INI_TEXT("Unable to read from MP3.")
#define TXT_ERROR_UNABLE_CREATE INI_TEXT("Unable to create MP3 stream buffer.")
char *GenreStr[]={
"Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge","Hip-Hop", // 0-7
"Jazz","Metal","New Age","Oldies","Other","Pop","R&B","Rap","Reggae","Rock",// 8-17
"Techno","Industrial","Alternative","Ska","Death Metal","Pranks", // 18-23
"Soundtrack","Euro-Techno","Ambient","Trip-Hop","Vocal","Jazz+Funk", // 24-29
"Fusion","Trance","Classical","Instrumental","Acid","House","Game", // 30-36
"Sound Clip","Gospel","Noise","Alt. Rock","Bass","Soul","Punk","Space", // 37-44
"Meditative","Instrumental Pop","Instrumental Rock","Ethnic","Gothic", // 45-49
"Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance","Dream", // 50-55
"Southern Rock","Comedy","Cult","Gangsta Rap","Top 40","Christian Rap", // 56-61
"Pop/Funk","Jungle","Native American","Cabaret","New Wave","Psychedelic", // 62-67
"Rave","Showtunes","Trailer","Lo-Fi","Tribal","Acid Punk","Acid Jazz", // 63-74
"Polka","Retro","Musical","Rock & Roll","Hard Rock","Folk","Folk/Rock", // 75-81
"National Folk","Swing","Fast-Fusion","Bebob","Latin","Revival","Celtic", // 82-88
"Bluegrass","Avantgarde","Gothic Rock","Progressive Rock", // 89-92
"Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band","Chorus", // 93-97
"Easy Listening","Acoustic","Humour","Speech","Chanson","Opera", // 98-103
"Chamber Music","Sonata","Symphony","Booty Bass","Primus","Porn Groove", // 104-109
"Satire","Slow Jam","Club","Tango","Samba","Folklore","Ballad", // 110-116
"Power Ballad","Rhythmic Soul","Freestyle","Duet","Punk Rock","Drum Solo", // 117-122
"Acapella","Euro-House","Dance Hall","Goa","Drum & Bass","Club-House", // 123-128
"Hardcore","Terror","Indie","BritPop","Negerpunk","Polsk punk","Beat", // 129-135
"Christian Gangsta Rap","Heavy Metal","Black Metal","Crossover", // 136-139
"Contemporary Christian","Christian Rock" // 140-141
};
#define DATASZ (1<<15) /* (32768) amount of data to read from disk each time */
#define BUFSZ (1<<16) /* (65536) size of audiostream buffer */
const int maxKnownGenre=sizeof(GenreStr)/sizeof(char *);
signed int mp3_pause = false;
//signed int PausedPos = 0;
//l_text filename;
//l_bool libamp_installed = FALSE;
typedef struct {
l_bool paused;
l_bool loaded;
l_text filename;
int buflen;
PACKFILE *f;
ALMP3_MP3STREAM *s;
} MP3_DATA;
l_bool mp3_init_driver (p_soundformat_item o)
{
return(TRUE);
}
l_bool mp3_init_file (p_soundformat_item o, l_text file, l_bool play)
{
MP3_DATA *mp3_data;
PACKFILE *f = NULL;
ALMP3_MP3STREAM *s = NULL;
char data[DATASZ];
l_text mp3_err;
int len;
o->extra = malloc(sizeof(MP3_DATA));
mp3_data = (MP3_DATA *) o->extra;
mp3_data->filename = _strdup(file);
if (!(f = pack_fopen(mp3_data->filename, F_READ)))
{
mp3_err = TXT_ERROR_UNABLE_OPEN;
goto error;
}
if ((len = pack_fread(data, DATASZ, f)) <= 0)
{
mp3_err = TXT_ERROR_UNABLE_READ;
goto error;
}
if (len < DATASZ)
{
if (!(s = almp3_create_mp3stream(data, len, TRUE)))
{
mp3_err = TXT_ERROR_UNABLE_CREATE;
goto error;
}
}
else
{
if (!(s = almp3_create_mp3stream(data, DATASZ, FALSE)))
{
mp3_err = TXT_ERROR_UNABLE_CREATE;
goto error;
}
}
mp3_data->f = f;
mp3_data->s = s;
mp3_data->loaded = TRUE;
mp3_data->paused = FALSE;
if (play == TRUE)
mp3_play_file(o);
DEBUG_printf("SFAMP3: Got to end of mp3_init_file()\n");
return(TRUE);
error:
seal_error(ERR_INFO, mp3_err);
pack_fclose(f);
free(mp3_data);
return(FALSE);
}
l_bool mp3_play_file (p_soundformat_item o)
{
MP3_DATA *d;
int ret;
d = (MP3_DATA *) o->extra;
if (d->loaded == TRUE)
{
ret = almp3_play_mp3stream(d->s, d->buflen, 255, 128);
if (ret == ALMP3_OK)
ret = TRUE;
else
ret = FALSE;
}
else
ret = FALSE;
return(ret);
}
l_bool mp3_poll_file(p_soundformat_item o)
{
MP3_DATA *mp3_data;
char *data;
long len;
mp3_data = (MP3_DATA *) o->extra;
if (mp3_data->loaded == FALSE)
return(FALSE);
data = (char *) almp3_get_mp3stream_buffer(mp3_data->s);
if (data)
{
len = pack_fread(data, DATASZ, mp3_data->f);
if (len < DATASZ)
almp3_free_mp3stream_buffer(mp3_data->s, len);
else
almp3_free_mp3stream_buffer(mp3_data->s, -1);
}
if (almp3_poll_mp3stream(mp3_data->s) == ALMP3_OK)
return(TRUE);
else
return(FALSE);
}
l_bool mp3_stop_file(p_soundformat_item o)
{
MP3_DATA *mp3_data;
mp3_data = (MP3_DATA *) o->extra;
if (mp3_data->loaded == FALSE)
return(FALSE);
almp3_stop_mp3stream(mp3_data->s);
return(TRUE);
}
l_bool mp3_pause_file(p_soundformat_item o)
{
MP3_DATA *mp3_data;
mp3_data = (MP3_DATA *) o->extra;
if (mp3_data->loaded == FALSE)
return(FALSE);
switch (mp3_data->paused)
{
case FALSE: // pause the file
mp3_data->paused = TRUE;
mp3_stop_file(o);
break;
case TRUE: // unpause the file
mp3_data->paused = FALSE;
mp3_play_file(o);
break;
}
return(mp3_data->paused);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -