flac
This commit is contained in:
parent
f3b3410e87
commit
d1f0477751
3 changed files with 79 additions and 0 deletions
|
|
@ -46,6 +46,7 @@ struct _MDESound {
|
||||||
|
|
||||||
extern MDESoundDriver MDESoundDriverMP3;
|
extern MDESoundDriver MDESoundDriverMP3;
|
||||||
extern MDESoundDriver MDESoundDriverVorbis;
|
extern MDESoundDriver MDESoundDriverVorbis;
|
||||||
|
extern MDESoundDriver MDESoundDriverFLAC;
|
||||||
|
|
||||||
MDESound MDESoundOpen(const char* path);
|
MDESound MDESoundOpen(const char* path);
|
||||||
|
|
||||||
|
|
|
||||||
77
sound/drv_flac.c
Normal file
77
sound/drv_flac.c
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
#include <MDE/Sound/Sound.h>
|
||||||
|
#include <MDE/Core/String.h>
|
||||||
|
|
||||||
|
#define DR_FLAC_IMPLEMENTATION
|
||||||
|
#include <dr_flac.h>
|
||||||
|
|
||||||
|
static void meta(void* user, drflac_metadata* metadata){
|
||||||
|
MDESoundContext ctx = user;
|
||||||
|
|
||||||
|
if(metadata->type == DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT){
|
||||||
|
const char* comment;
|
||||||
|
drflac_vorbis_comment_iterator it;
|
||||||
|
drflac_uint32 len;
|
||||||
|
|
||||||
|
drflac_init_vorbis_comment_iterator(&it, metadata->data.vorbis_comment.commentCount, metadata->data.vorbis_comment.pComments);
|
||||||
|
while((comment = drflac_next_vorbis_comment(&it, &len)) != NULL){
|
||||||
|
char* s = malloc(len + 1);
|
||||||
|
char* p;
|
||||||
|
memcpy(s, comment, len);
|
||||||
|
s[len] = 0;
|
||||||
|
p = strchr(s, '=');
|
||||||
|
if(p != NULL) {
|
||||||
|
p[0] = 0;
|
||||||
|
if(strcasecmp(s, "TITLE") == 0) {
|
||||||
|
ctx->title = MDEStringDuplicate(p + 1);
|
||||||
|
} else if(strcasecmp(s, "ALBUM") == 0) {
|
||||||
|
ctx->album = MDEStringDuplicate(p + 1);
|
||||||
|
} else if(strcasecmp(s, "ARTIST") == 0) {
|
||||||
|
ctx->artist = MDEStringDuplicate(p + 1);
|
||||||
|
} else if(strcasecmp(s, "GENRE") == 0) {
|
||||||
|
ctx->genre = MDEStringDuplicate(p + 1);
|
||||||
|
} else if(strcasecmp(s, "TRACKNUMBER") == 0) {
|
||||||
|
ctx->track = atoi(p + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static MDESoundContext flac_open(const char* path) {
|
||||||
|
MDESoundContext ctx = malloc(sizeof(*ctx));
|
||||||
|
memset(ctx, 0, sizeof(*ctx));
|
||||||
|
|
||||||
|
ctx->opaque = drflac_open_file_with_metadata(path, meta, ctx, NULL);
|
||||||
|
if(ctx->opaque == NULL){
|
||||||
|
free(ctx);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->sample_rate = ((drflac*)ctx->opaque)->sampleRate;
|
||||||
|
ctx->channels = ((drflac*)ctx->opaque)->channels;
|
||||||
|
ctx->frames = ((drflac*)ctx->opaque)->totalPCMFrameCount;
|
||||||
|
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void flac_close(MDESoundContext ctx) {
|
||||||
|
drflac_close(ctx->opaque);
|
||||||
|
free(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int flac_read(MDESoundContext ctx, short* out, int frames) {
|
||||||
|
return drflac_read_pcm_frames_s16(ctx->opaque, frames, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void flac_seek(MDESoundContext ctx, int frames) {
|
||||||
|
drflac_seek_to_pcm_frame(ctx->opaque, frames);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MDESoundDriverRec rec = {
|
||||||
|
flac_open,
|
||||||
|
flac_close,
|
||||||
|
flac_read,
|
||||||
|
flac_seek};
|
||||||
|
MDESoundDriver MDESoundDriverFLAC = &rec;
|
||||||
|
|
@ -15,6 +15,7 @@ MDESound MDESoundOpen(const char* path) {
|
||||||
|
|
||||||
TRY_DRIVER(MP3);
|
TRY_DRIVER(MP3);
|
||||||
TRY_DRIVER(Vorbis);
|
TRY_DRIVER(Vorbis);
|
||||||
|
TRY_DRIVER(FLAC);
|
||||||
|
|
||||||
if(sound->context == NULL) {
|
if(sound->context == NULL) {
|
||||||
free(sound);
|
free(sound);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue