wip
This commit is contained in:
parent
3b0f5e6e2d
commit
8aca3fb166
5 changed files with 24 additions and 28 deletions
|
|
@ -3,11 +3,10 @@ include(MDEPkgConfig)
|
||||||
setup_project(mauplay ${CMAKE_INSTALL_BINDIR})
|
setup_project(mauplay ${CMAKE_INSTALL_BINDIR})
|
||||||
|
|
||||||
pkg_config_add(mauplay sqlite3)
|
pkg_config_add(mauplay sqlite3)
|
||||||
pkg_config_add(mauplay sndfile)
|
|
||||||
pkg_config_add(mauplay samplerate)
|
pkg_config_add(mauplay samplerate)
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
mauplay
|
mauplay
|
||||||
PRIVATE
|
PRIVATE
|
||||||
MDEAudio
|
MDEAudio MDESound
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -3,18 +3,18 @@
|
||||||
#include <samplerate.h>
|
#include <samplerate.h>
|
||||||
#include <stb_ds.h>
|
#include <stb_ds.h>
|
||||||
|
|
||||||
static void* audio;
|
static MDEAudio audio;
|
||||||
pthread_mutex_t audio_mutex;
|
pthread_mutex_t audio_mutex;
|
||||||
queue_t* queue = NULL;
|
queue_t* queue = NULL;
|
||||||
int queue_seek = -1;
|
int queue_seek = -1;
|
||||||
int paused = 0;
|
int paused = 0;
|
||||||
|
|
||||||
static void handler(void* handle, void* user, void* data, int frames) {
|
static void handler(MDEAudio handle, void* user, void* data, int frames) {
|
||||||
memset(data, 0, frames * 2 * 2);
|
memset(data, 0, frames * 2 * 2);
|
||||||
|
|
||||||
pthread_mutex_lock(&audio_mutex);
|
pthread_mutex_lock(&audio_mutex);
|
||||||
if(queue_seek != -1 && !paused) {
|
if(queue_seek != -1 && !paused) {
|
||||||
int from_frames = frames * queue[queue_seek].sfi.samplerate / MDEAudioRate;
|
int from_frames = frames * queue[queue_seek].sound->context->sample_rate / MDEAudioRate;
|
||||||
float* from = malloc(from_frames * sizeof(*from) * 2);
|
float* from = malloc(from_frames * sizeof(*from) * 2);
|
||||||
float* to = malloc(frames * sizeof(*to) * 2);
|
float* to = malloc(frames * sizeof(*to) * 2);
|
||||||
SRC_DATA d;
|
SRC_DATA d;
|
||||||
|
|
@ -24,9 +24,9 @@ static void handler(void* handle, void* user, void* data, int frames) {
|
||||||
d.data_out = to;
|
d.data_out = to;
|
||||||
d.input_frames = from_frames;
|
d.input_frames = from_frames;
|
||||||
d.output_frames = frames;
|
d.output_frames = frames;
|
||||||
d.src_ratio = (double)MDEAudioRate / queue[queue_seek].sfi.samplerate;
|
d.src_ratio = (double)MDEAudioRate / queue[queue_seek].sound->context->sample_rate;
|
||||||
|
|
||||||
f = sf_readf_float(queue[queue_seek].sf, from, from_frames);
|
f = MDESoundReadFloat(queue[queue_seek].sound, from, from_frames);
|
||||||
src_simple(&d, SRC_SINC_BEST_QUALITY, 2);
|
src_simple(&d, SRC_SINC_BEST_QUALITY, 2);
|
||||||
src_float_to_short_array(to, data, frames * 2);
|
src_float_to_short_array(to, data, frames * 2);
|
||||||
queue[queue_seek].frames += f;
|
queue[queue_seek].frames += f;
|
||||||
|
|
@ -55,7 +55,7 @@ void audio_init(void) {
|
||||||
void audio_queue(const char* path) {
|
void audio_queue(const char* path) {
|
||||||
queue_t q;
|
queue_t q;
|
||||||
q.path = MDEFileAbsolutePath(path);
|
q.path = MDEFileAbsolutePath(path);
|
||||||
q.sf = sf_open(q.path, SFM_READ, &q.sfi);
|
q.sound = MDESoundOpen(q.path);
|
||||||
q.frames = 0;
|
q.frames = 0;
|
||||||
|
|
||||||
pthread_mutex_lock(&audio_mutex);
|
pthread_mutex_lock(&audio_mutex);
|
||||||
|
|
|
||||||
17
mauplay/db.c
17
mauplay/db.c
|
|
@ -61,8 +61,7 @@ int db_init(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int db_bind(sqlite3_stmt* stmt, const char* path) {
|
static int db_bind(sqlite3_stmt* stmt, const char* path) {
|
||||||
SF_INFO sfi;
|
MDESound sound = MDESoundOpen(path);
|
||||||
SNDFILE* sf = sf_open(path, SFM_READ, &sfi);
|
|
||||||
char* p;
|
char* p;
|
||||||
const char* s_title;
|
const char* s_title;
|
||||||
const char* s_artist;
|
const char* s_artist;
|
||||||
|
|
@ -70,13 +69,13 @@ static int db_bind(sqlite3_stmt* stmt, const char* path) {
|
||||||
const char* s_genre;
|
const char* s_genre;
|
||||||
int s_length;
|
int s_length;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
if(sf == NULL) return 1;
|
if(sound == NULL) return 1;
|
||||||
|
|
||||||
s_title = sf_get_string(sf, SF_STR_TITLE);
|
s_title = sound->context->title;
|
||||||
s_artist = sf_get_string(sf, SF_STR_ARTIST);
|
s_artist = sound->context->artist;
|
||||||
s_album = sf_get_string(sf, SF_STR_ALBUM);
|
s_album = sound->context->album;
|
||||||
s_genre = sf_get_string(sf, SF_STR_GENRE);
|
s_genre = sound->context->genre;
|
||||||
s_length = sfi.frames / sfi.samplerate;
|
s_length = sound->context->frames / sound->context->sample_rate;
|
||||||
|
|
||||||
if(s_title == NULL) s_title = path;
|
if(s_title == NULL) s_title = path;
|
||||||
if(s_artist == NULL) s_artist = "<unknown>";
|
if(s_artist == NULL) s_artist = "<unknown>";
|
||||||
|
|
@ -95,7 +94,7 @@ static int db_bind(sqlite3_stmt* stmt, const char* path) {
|
||||||
sqlite3_bind_int(stmt, 6, s_length);
|
sqlite3_bind_int(stmt, 6, s_length);
|
||||||
sqlite3_bind_int64(stmt, 7, s.st_mtime);
|
sqlite3_bind_int64(stmt, 7, s.st_mtime);
|
||||||
|
|
||||||
sf_close(sf);
|
MDESoundClose(sound);
|
||||||
|
|
||||||
free(p);
|
free(p);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@
|
||||||
#include <Mw/Milsko.h>
|
#include <Mw/Milsko.h>
|
||||||
|
|
||||||
/* External */
|
/* External */
|
||||||
#include <sndfile.h>
|
|
||||||
|
|
||||||
/* Standard */
|
/* Standard */
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
@ -31,8 +30,7 @@ typedef struct numkv {
|
||||||
|
|
||||||
typedef struct queue {
|
typedef struct queue {
|
||||||
char* path;
|
char* path;
|
||||||
SNDFILE* sf;
|
MDESound sound;
|
||||||
SF_INFO sfi;
|
|
||||||
int frames;
|
int frames;
|
||||||
} queue_t;
|
} queue_t;
|
||||||
|
|
||||||
|
|
|
||||||
16
mauplay/ui.c
16
mauplay/ui.c
|
|
@ -190,7 +190,7 @@ static void list_activate(MwWidget handle, void* user, void* client) {
|
||||||
pthread_mutex_lock(&audio_mutex);
|
pthread_mutex_lock(&audio_mutex);
|
||||||
queue_seek = (*(int*)client) - 1;
|
queue_seek = (*(int*)client) - 1;
|
||||||
queue[queue_seek].frames = 0;
|
queue[queue_seek].frames = 0;
|
||||||
sf_seek(queue[queue_seek].sf, 0, SEEK_SET);
|
MDESoundSeek(queue[queue_seek].sound, 0);
|
||||||
pthread_mutex_unlock(&audio_mutex);
|
pthread_mutex_unlock(&audio_mutex);
|
||||||
} else if(ui_last == all_music) {
|
} else if(ui_last == all_music) {
|
||||||
audio_queue(db_musics[(*(int*)client) - 1].key);
|
audio_queue(db_musics[(*(int*)client) - 1].key);
|
||||||
|
|
@ -223,7 +223,7 @@ static void window_tick(MwWidget handle, void* user, void* client) {
|
||||||
MwNtext, buf,
|
MwNtext, buf,
|
||||||
NULL);
|
NULL);
|
||||||
MwVaApply(seekbar,
|
MwVaApply(seekbar,
|
||||||
MwNmaxValue, queue[queue_seek].sfi.frames / queue[queue_seek].sfi.samplerate,
|
MwNmaxValue, queue[queue_seek].sound->context->frames / queue[queue_seek].sound->context->sample_rate,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
@ -233,8 +233,8 @@ static void window_tick(MwWidget handle, void* user, void* client) {
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
if(arrlen(queue) > 0 && queue_seek != -1) {
|
if(arrlen(queue) > 0 && queue_seek != -1) {
|
||||||
int elsec = queue[queue_seek].frames / queue[queue_seek].sfi.samplerate;
|
int elsec = queue[queue_seek].frames / queue[queue_seek].sound->context->sample_rate;
|
||||||
int rmsec = (queue[queue_seek].sfi.frames / queue[queue_seek].sfi.samplerate) - elsec;
|
int rmsec = (queue[queue_seek].sound->context->frames / queue[queue_seek].sound->context->sample_rate) - elsec;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
sprintf(buf, "%d:%02d", elsec / 60, elsec % 60);
|
sprintf(buf, "%d:%02d", elsec / 60, elsec % 60);
|
||||||
|
|
@ -248,7 +248,7 @@ static void window_tick(MwWidget handle, void* user, void* client) {
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if(changed) {
|
if(changed) {
|
||||||
sf_seek(queue[queue_seek].sf, (queue[queue_seek].frames = MwGetInteger(seekbar, MwNvalue) * queue[queue_seek].sfi.samplerate), SEEK_SET);
|
MDESoundSeek(queue[queue_seek].sound, (queue[queue_seek].frames = MwGetInteger(seekbar, MwNvalue) * queue[queue_seek].sound->context->sample_rate));
|
||||||
changed = 0;
|
changed = 0;
|
||||||
} else {
|
} else {
|
||||||
MwVaApply(seekbar,
|
MwVaApply(seekbar,
|
||||||
|
|
@ -280,7 +280,7 @@ static void bskipback_activate(MwWidget handle, void* user, void* client) {
|
||||||
}
|
}
|
||||||
if(arrlen(queue) > 0) {
|
if(arrlen(queue) > 0) {
|
||||||
queue[queue_seek].frames = 0;
|
queue[queue_seek].frames = 0;
|
||||||
sf_seek(queue[queue_seek].sf, 0, SEEK_SET);
|
MDESoundSeek(queue[queue_seek].sound, 0);
|
||||||
} else {
|
} else {
|
||||||
queue_seek = -1;
|
queue_seek = -1;
|
||||||
}
|
}
|
||||||
|
|
@ -303,7 +303,7 @@ static void bstop_activate(MwWidget handle, void* user, void* client) {
|
||||||
pthread_mutex_lock(&audio_mutex);
|
pthread_mutex_lock(&audio_mutex);
|
||||||
if(queue_seek != -1) {
|
if(queue_seek != -1) {
|
||||||
queue[queue_seek].frames = 0;
|
queue[queue_seek].frames = 0;
|
||||||
sf_seek(queue[queue_seek].sf, 0, SEEK_SET);
|
MDESoundSeek(queue[queue_seek].sound, 0);
|
||||||
}
|
}
|
||||||
queue_seek = -1;
|
queue_seek = -1;
|
||||||
pthread_mutex_unlock(&audio_mutex);
|
pthread_mutex_unlock(&audio_mutex);
|
||||||
|
|
@ -318,7 +318,7 @@ static void bskipfwd_activate(MwWidget handle, void* user, void* client) {
|
||||||
}
|
}
|
||||||
if(arrlen(queue) > 0) {
|
if(arrlen(queue) > 0) {
|
||||||
queue[queue_seek].frames = 0;
|
queue[queue_seek].frames = 0;
|
||||||
sf_seek(queue[queue_seek].sf, 0, SEEK_SET);
|
MDESoundSeek(queue[queue_seek].sound, 0);
|
||||||
} else {
|
} else {
|
||||||
queue_seek = -1;
|
queue_seek = -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue