add a wip not working flac player.
i don't know how to code one. im trying to copy the oggplayer one and trying to use the flac api but genuinely i don't know what i'm doing at all.
This commit is contained in:
parent
9369bf4da5
commit
2b527cb917
3 changed files with 216 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
||||||
add_subdirectory(assets)
|
add_subdirectory(assets)
|
||||||
add_subdirectory(duktape)
|
add_subdirectory(duktape)
|
||||||
|
# add_subdirectory(flacplayer)
|
||||||
|
|
||||||
add_executable(WiiDuktape main.c)
|
add_executable(WiiDuktape main.c)
|
||||||
target_link_libraries(WiiDuktape GRRLIB)
|
target_link_libraries(WiiDuktape GRRLIB)
|
||||||
|
|
6
source/flacplayer/CMakeLists.txt
Normal file
6
source/flacplayer/CMakeLists.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules(FLAC REQUIRED flac)
|
||||||
|
|
||||||
|
add_library(flacplayer flacplayer.c)
|
||||||
|
target_link_libraries(flacplayer PRIVATE ${FLAC_LIBRARIES})
|
||||||
|
target_include_directories(flacplayer PRIVATE ${FLAC_INCLUDE_DIRS})
|
209
source/flacplayer/flacplayer.c
Normal file
209
source/flacplayer/flacplayer.c
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
#include <FLAC/stream_decoder.h>
|
||||||
|
#include <gccore.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
char *mem;
|
||||||
|
int size;
|
||||||
|
int pos;
|
||||||
|
} file[4];
|
||||||
|
|
||||||
|
#define READ_SAMPLES 4096 // samples that it must read before to send
|
||||||
|
#define MAX_PCMOUT 4096 // minimum size to read ogg samples
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
// OggVorbis_File vf;
|
||||||
|
// vorbis_info *vi;
|
||||||
|
int current_section;
|
||||||
|
|
||||||
|
// OGG file operation
|
||||||
|
int fd;
|
||||||
|
int mode;
|
||||||
|
int eof;
|
||||||
|
int flag;
|
||||||
|
int volume;
|
||||||
|
int seek_time;
|
||||||
|
|
||||||
|
/* OGG buffer control */
|
||||||
|
short pcmout[2][READ_SAMPLES + MAX_PCMOUT * 2]; /* take 4k out of the data segment, not the stack */
|
||||||
|
int pcmout_pos;
|
||||||
|
int pcm_indx;
|
||||||
|
|
||||||
|
} private_data_flac;
|
||||||
|
|
||||||
|
static private_data_flac private_flac;
|
||||||
|
|
||||||
|
// i don't know what this is doing at all
|
||||||
|
static int mem_open(char * ogg, int size)
|
||||||
|
{
|
||||||
|
static int one = 1;
|
||||||
|
int n;
|
||||||
|
if (one)
|
||||||
|
{
|
||||||
|
one = 0;
|
||||||
|
for (n = 0; n < 4; n++)
|
||||||
|
file[n].size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (n = 0; n < 4; n++)
|
||||||
|
{
|
||||||
|
if (file[n].size == 0)
|
||||||
|
{
|
||||||
|
file[n].mem = ogg;
|
||||||
|
file[n].size = size;
|
||||||
|
file[n].pos = 0;
|
||||||
|
return (0x666 + n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FLAC__StreamDecoderReadStatus f_read(const FLAC__StreamDecoder * decoder, FLAC__byte buffer[], size_t * bites, void * client_data) {
|
||||||
|
int bytes = sizeof(FLAC__byte);
|
||||||
|
int blocks = *bites;
|
||||||
|
int * f = client_data;
|
||||||
|
void * punt = buffer;
|
||||||
|
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
int d;
|
||||||
|
|
||||||
|
if (bytes * blocks <= 0)
|
||||||
|
return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
|
||||||
|
|
||||||
|
blocks = bytes * blocks;
|
||||||
|
c = 0;
|
||||||
|
|
||||||
|
while (blocks > 0)
|
||||||
|
{
|
||||||
|
b = blocks;
|
||||||
|
if (b > 4096)
|
||||||
|
b = 4096;
|
||||||
|
|
||||||
|
if (*f >= 0x666 && *f <= 0x669)
|
||||||
|
{
|
||||||
|
d = (*f) - 0x666;
|
||||||
|
if (file[d].size == 0)
|
||||||
|
return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
|
||||||
|
if ((file[d].pos + b) > file[d].size)
|
||||||
|
b = file[d].size - file[d].pos;
|
||||||
|
if (b > 0)
|
||||||
|
{
|
||||||
|
memcpy(punt, file[d].mem + file[d].pos, b);
|
||||||
|
file[d].pos += b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
b = read(*f, ((char *) punt) + c, b);
|
||||||
|
|
||||||
|
if (b <= 0)
|
||||||
|
{
|
||||||
|
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
|
||||||
|
}
|
||||||
|
c += b;
|
||||||
|
blocks -= b;
|
||||||
|
}
|
||||||
|
return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLAC__StreamDecoderSeekStatus f_seek(const FLAC__StreamDecoder * decoder, FLAC__uint64 absolute_byte_offset, void * client_data) {
|
||||||
|
int * f = client_data;
|
||||||
|
int mode = SEEK_SET;
|
||||||
|
unsigned long offset = absolute_byte_offset;
|
||||||
|
|
||||||
|
if(f==NULL) return(FLAC__STREAM_DECODER_SEEK_STATUS_ERROR);
|
||||||
|
|
||||||
|
int k, d;
|
||||||
|
mode &= 3;
|
||||||
|
if (*f >= 0x666 && *f <= 0x669)
|
||||||
|
{
|
||||||
|
d = (*f) - 0x666;
|
||||||
|
k = 0;
|
||||||
|
|
||||||
|
if (file[d].size == 0)
|
||||||
|
return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
|
||||||
|
|
||||||
|
if (mode == 0)
|
||||||
|
{
|
||||||
|
if ((offset) >= file[d].size)
|
||||||
|
{
|
||||||
|
file[d].pos = file[d].size;
|
||||||
|
k = -1;
|
||||||
|
}
|
||||||
|
else if ((offset) < 0)
|
||||||
|
{
|
||||||
|
file[d].pos = 0;
|
||||||
|
k = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
file[d].pos = offset;
|
||||||
|
}
|
||||||
|
if (mode == 1)
|
||||||
|
{
|
||||||
|
if ((file[d].pos + offset) >= file[d].size)
|
||||||
|
{
|
||||||
|
file[d].pos = file[d].size;
|
||||||
|
k = -1;
|
||||||
|
}
|
||||||
|
else if ((file[d].pos + offset) < 0)
|
||||||
|
{
|
||||||
|
file[d].pos = 0;
|
||||||
|
k = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
file[d].pos += offset;
|
||||||
|
}
|
||||||
|
if (mode == 2)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((file[d].size + offset) >= file[d].size)
|
||||||
|
{
|
||||||
|
file[d].pos = file[d].size;
|
||||||
|
k = -1;
|
||||||
|
}
|
||||||
|
else if ((file[d].size + offset) < 0)
|
||||||
|
{
|
||||||
|
file[d].pos = 0;
|
||||||
|
k = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
file[d].pos = file[d].size + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
k = lseek(*f, (int) offset, mode);
|
||||||
|
|
||||||
|
if (k < 0)
|
||||||
|
k = -1;
|
||||||
|
else
|
||||||
|
k = 0;
|
||||||
|
|
||||||
|
if (k == -1) {
|
||||||
|
return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR;
|
||||||
|
} else {
|
||||||
|
return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PlayFlac(const void * buffer, signed int len) {
|
||||||
|
|
||||||
|
private_flac.fd = mem_open((char *)buffer, len);
|
||||||
|
|
||||||
|
FLAC__StreamDecoder * decoder;
|
||||||
|
FLAC__StreamDecoderInitStatus init_status;
|
||||||
|
|
||||||
|
decoder = FLAC__stream_decoder_new();
|
||||||
|
|
||||||
|
if (decoder == NULL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// init_status = FLAC__stream_decoder_init_stream(decoder);
|
||||||
|
}
|
Loading…
Reference in a new issue