AUDIODATA_EXPORT float* readaudio(const char *filename, const int sr, float *sigbuf, unsigned int *buflen,\ const float nbsecs, AudioMetaData *mdata, int *error) { long orig_sr; unsigned int orig_length = 0; float *inbuffer = NULL; *error = PHERR_SUCCESS; if (filename == NULL || buflen == NULL) { *error = PHERR_NULLARG; return NULL; } if (mdata) init_mdata(mdata); const char *suffix = strrchr(filename, '.'); if (*suffix != '\0' && !strncasecmp(suffix+1, "mp3",3)) { #ifdef HAVE_MPG123 inbuffer = readaudio_mp3(filename, &orig_sr, &orig_length, nbsecs, mdata, error); #endif /* HAVE_MPG123 */ } else { inbuffer = readaudio_snd(filename, &orig_sr, &orig_length, nbsecs, mdata, error); } if (inbuffer == NULL){ return NULL; } /* if no data extracted for title, use the file name */ if (mdata && mdata->title2 == NULL){ char *name = strrchr(filename, '/'); if (name == NULL) name = strchr(filename, '\\'); if (name) mdata->title2 = strdup(name+1); } /* resample float array */ /* set desired sr ratio */ double sr_ratio = (double)(sr)/(double)orig_sr; if (src_is_valid_ratio(sr_ratio) == 0){ *error = PHERR_BADSR; free(inbuffer); return NULL; } /* allocate output buffer for conversion */ unsigned int outbufferlength = sr_ratio*(orig_length); float *outbuffer = NULL; if (sigbuf && outbufferlength < *buflen){ outbuffer = sigbuf; } else { outbuffer = (float*)malloc(outbufferlength*sizeof(float)); } if (!outbuffer){ free(inbuffer); *error = PHERR_NOBUFALLOCD; return NULL; } SRC_STATE *src_state = src_new(SRC_LINEAR, 1, error); if (!src_state){ *error = PHERR_SRCCONTXT; free(inbuffer); if (outbuffer != sigbuf) free(outbuffer); return NULL; } SRC_DATA src_data; src_data.data_in = inbuffer; src_data.data_out = outbuffer; src_data.input_frames = orig_length; src_data.output_frames = outbufferlength; src_data.end_of_input = SF_TRUE; src_data.src_ratio = sr_ratio; /* sample rate conversion */ *error = src_process(src_state, &src_data); if (*error){ *error = PHERR_SRCPROC; free(inbuffer); if (outbuffer != sigbuf) free(outbuffer); src_delete(src_state); return NULL; } *buflen = outbufferlength; src_delete(src_state); free(inbuffer); return outbuffer; }
float* ph_readaudio2(const char *filename, int sr, float *sigbuf, int &buflen, const float nbsecs) { long orig_sr; float *inbuffer = NULL; unsigned int inbufferlength; buflen = 0; const char *suffix = strrchr(filename, '.'); if (suffix == NULL) return NULL; if (!strcasecmp(suffix+1, "mp3")) { #ifdef HAVE_LIBMPG123 inbuffer = readaudio_mp3(filename, &orig_sr, nbsecs, &inbufferlength); #endif /* HAVE_LIBMPG123 */ } else { inbuffer = readaudio_snd(filename, &orig_sr, nbsecs, &inbufferlength); } if (inbuffer == NULL) { return NULL; } /* resample float array */ /* set desired sr ratio */ double sr_ratio = (double)(sr)/(double)orig_sr; if (src_is_valid_ratio(sr_ratio) == 0) { free(inbuffer); return NULL; } /* allocate output buffer for conversion */ unsigned int outbufferlength = sr_ratio*inbufferlength; float *outbuffer = (float*)malloc(outbufferlength*sizeof(float)); if (!outbuffer) { free(inbuffer); return NULL; } int error; SRC_STATE *src_state = src_new(SRC_LINEAR, 1, &error); if (!src_state) { free(inbuffer); free(outbuffer); return NULL; } SRC_DATA src_data; src_data.data_in = inbuffer; src_data.data_out = outbuffer; src_data.input_frames = inbufferlength; src_data.output_frames = outbufferlength; src_data.end_of_input = SF_TRUE; src_data.src_ratio = sr_ratio; /* sample rate conversion */ if (error = src_process(src_state, &src_data)) { free(inbuffer); free(outbuffer); src_delete(src_state); return NULL; } buflen = src_data.output_frames; src_delete(src_state); free(inbuffer); return outbuffer; }