DLL_EXPORT int libsox_(Main_init)(lua_State *L) { luaT_pushmetatable(L, torch_Tensor); luaT_registeratname(L, libsox_(Main__), "libsox"); // Initialize sox library sox_format_init(); return 1; }
static libsox_(AudioData) libsox_(read_audio_file)(const char *file_name) { // Create sox objects and read into int32_t buffer sox_format_t *fd; fd = sox_open_read(file_name, NULL, NULL, NULL); if (fd == NULL) abort_("[read_audio_file] Failure to read file"); int nchannels = fd->signal.channels; long buffer_size = fd->signal.length; double rate = fd->signal.rate; int32_t *buffer = (int32_t *)malloc(sizeof(int32_t) * buffer_size); size_t samples_read = sox_read(fd, buffer, buffer_size); if (samples_read == 0) abort_("[read_audio_file] Empty file or read failed in sox_read"); // alloc tensor THTensor *tensor = THTensor_(newWithSize2d)(nchannels, samples_read / nchannels ); tensor = THTensor_(newContiguous)(tensor); real *tensor_data = THTensor_(data)(tensor); // convert audio to dest tensor int x,k; for (k=0; k<nchannels; k++) { for (x=0; x<samples_read/nchannels; x++) { *tensor_data++ = (real)buffer[x*nchannels+k]; } } // free buffer and sox structures sox_close(fd); free(buffer); THTensor_(free)(tensor); libsox_(AudioData) ret; ret.t = tensor; ret.nChannels = nchannels; ret.bufferSize = buffer_size; ret.rate = rate; ret.lenSecs = (samples_read / nchannels) / rate; return ret; }
static int libsox_(Main_load_full)(lua_State *L) { const char *filename = luaL_checkstring(L, 1); libsox_(AudioData) data = libsox_(read_audio_file)(filename); lua_newtable(L); lua_pushstring(L, "tensor"); luaT_pushudata(L, data.t, torch_Tensor); lua_settable(L, -3); libsox_(TableNum)(L, "numChannels", data.nChannels); libsox_(TableNum)(L, "bufferSize", data.bufferSize); libsox_(TableNum)(L, "rate", data.rate); libsox_(TableNum)(L, "lenSecs", data.lenSecs); return 1; }
static int libsox_(Main_load)(lua_State *L) { const char *filename = luaL_checkstring(L, 1); THTensor *tensor = libsox_(read_audio_file)(filename); luaT_pushudata(L, tensor, torch_Tensor); return 1; }
free(buffer); THTensor_(free)(tensor); // return tensor return tensor; } static int libsox_(Main_load)(lua_State *L) { const char *filename = luaL_checkstring(L, 1); THTensor *tensor = libsox_(read_audio_file)(filename); luaT_pushudata(L, tensor, torch_Tensor); return 1; } static const luaL_Reg libsox_(Main__)[] = { {"load", libsox_(Main_load)}, {NULL, NULL} }; DLL_EXPORT int libsox_(Main_init)(lua_State *L) { luaT_pushmetatable(L, torch_Tensor); luaT_registeratname(L, libsox_(Main__), "libsox"); // Initialize sox library sox_format_init(); return 1; } #endif
lua_pushstring(L, "tensor"); luaT_pushudata(L, data.t, torch_Tensor); lua_settable(L, -3); libsox_(TableNum)(L, "numChannels", data.nChannels); libsox_(TableNum)(L, "bufferSize", data.bufferSize); libsox_(TableNum)(L, "rate", data.rate); libsox_(TableNum)(L, "lenSecs", data.lenSecs); return 1; } static const luaL_Reg libsox_(Main__)[] = { {"load", libsox_(Main_load)}, {"load_full", libsox_(Main_load_full)}, {NULL, NULL} }; DLL_EXPORT int libsox_(Main_init)(lua_State *L) { luaT_pushmetatable(L, torch_Tensor); luaT_registeratname(L, libsox_(Main__), "libsox"); // Initialize sox library sox_format_init(); return 1; } #endif