kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
100 wiersze
2.6 KiB
C++
100 wiersze
2.6 KiB
C++
// C language wrapper library for Future Composer audio decoder
|
|
// Copyright (C) 2008 Michael Schwendt
|
|
//
|
|
// 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
#include "fc14audiodecoder.h"
|
|
|
|
#include "FC.h"
|
|
#include "LamePaula.h"
|
|
|
|
#define FC14_DECLARE_DECODER \
|
|
fc14dec *p = (fc14dec*)ptr
|
|
|
|
struct fc14dec {
|
|
FC decoder;
|
|
LamePaulaMixer mixer;
|
|
};
|
|
|
|
void* fc14dec_new() {
|
|
fc14dec *p = new fc14dec;
|
|
p->decoder.setMixer(&p->mixer);
|
|
return (void*)p;
|
|
}
|
|
|
|
void fc14dec_delete(void* ptr) {
|
|
FC14_DECLARE_DECODER;
|
|
delete p;
|
|
}
|
|
|
|
int fc14dec_detect(void* ptr, void* data, unsigned long int length) {
|
|
FC14_DECLARE_DECODER;
|
|
return p->decoder.isOurData(data,length);
|
|
}
|
|
|
|
int fc14dec_init(void* ptr, void* data, unsigned long int length) {
|
|
FC14_DECLARE_DECODER;
|
|
return p->decoder.init(data,length);
|
|
}
|
|
|
|
void fc14dec_restart(void* ptr) {
|
|
FC14_DECLARE_DECODER;
|
|
p->decoder.restart();
|
|
}
|
|
|
|
void fc14dec_seek(void* ptr, long int ms) {
|
|
FC14_DECLARE_DECODER;
|
|
p->decoder.restart();
|
|
while (ms>=0) {
|
|
p->decoder.run();
|
|
ms -= 20;
|
|
if ( fc14dec_song_end(p) ) {
|
|
break;
|
|
}
|
|
};
|
|
}
|
|
|
|
void fc14dec_mixer_init(void* ptr, int freq, int bits, int channels, int zero) {
|
|
FC14_DECLARE_DECODER;
|
|
p->mixer.init(freq,bits,channels,zero);
|
|
}
|
|
|
|
void fc14dec_buffer_fill(void* ptr, void* buffer, unsigned long int length) {
|
|
FC14_DECLARE_DECODER;
|
|
p->mixer.fillBuffer(buffer,length,&p->decoder);
|
|
}
|
|
|
|
int fc14dec_song_end(void* ptr) {
|
|
FC14_DECLARE_DECODER;
|
|
return p->decoder.songEnd;
|
|
}
|
|
|
|
unsigned long int fc14dec_duration(void* ptr) {
|
|
FC14_DECLARE_DECODER;
|
|
// Determine duration with a dry-run till song-end.
|
|
unsigned long int ms = 0;
|
|
do {
|
|
p->decoder.run();
|
|
ms += 20;
|
|
} while ( !fc14dec_song_end(p) );
|
|
p->decoder.restart();
|
|
return ms;
|
|
}
|
|
|
|
const char* fc14dec_format_name(void* ptr) {
|
|
FC14_DECLARE_DECODER;
|
|
return p->decoder.formatName.c_str();
|
|
}
|