int psf2_is_our_fd(const char *filename, VFSFile *file) { uint8 magic[4]; if (vfs_fread(magic, 1, 4, file) < 4) return FALSE; return (psf_probe(magic) != ENG_NONE); }
static bool_t psf2_play(const char * filename, VFSFile * file) { void *buffer; int64_t size; PSFEngine eng; bool_t error = FALSE; const char * slash = strrchr (filename, '/'); if (! slash) return FALSE; SNCOPY (dirbuf, filename, slash + 1 - filename); dirpath = dirbuf; vfs_file_get_contents (filename, & buffer, & size); eng = psf_probe(buffer); if (eng == ENG_NONE || eng == ENG_COUNT) { free(buffer); return FALSE; } f = &psf_functor_map[eng]; if (f->start(buffer, size) != AO_SUCCESS) { free(buffer); return FALSE; } aud_input_open_audio(FMT_S16_NE, 44100, 2); aud_input_set_bitrate(44100*2*2*8); stop_flag = FALSE; f->execute(); f->stop(); f = NULL; dirpath = NULL; free(buffer); return ! error; }
static bool_t psf2_play(InputPlayback * data, const char * filename, VFSFile * file, int start_time, int stop_time, bool_t pause) { void *buffer; int64_t size; PSFEngine eng; PSFEngineFunctors *f; bool_t error = FALSE; path = strdup(filename); vfs_file_get_contents (filename, & buffer, & size); eng = psf_probe(buffer); if (eng == ENG_NONE || eng == ENG_COUNT) { free(buffer); return FALSE; } f = &psf_functor_map[eng]; if (f->start(buffer, size) != AO_SUCCESS) { free(buffer); return FALSE; } data->output->open_audio(FMT_S16_NE, 44100, 2); data->set_params(data, 44100*2*2*8, 44100, 2); stop_flag = FALSE; data->set_pb_ready(data); for (;;) { f->execute(data); if (seek) { data->output->flush(seek); f->stop(); if (f->start(buffer, size) == AO_SUCCESS) { f->seek(seek); seek = 0; continue; } else break; } f->stop(); break; } pthread_mutex_lock (& mutex); stop_flag = TRUE; pthread_mutex_unlock (& mutex); free(buffer); free(path); return ! error; }