result WavStream::loadFileToMem(File *aFile) { delete[] mFilename; delete mMemFile; mStreamFile = 0; mMemFile = 0; mFilename = 0; mSampleCount = 0; MemoryFile *mf = new MemoryFile(); int res = mf->openFileToMem(aFile); if (res != SO_NO_ERROR) { delete mf; return res; } res = parse(mf); if (res != SO_NO_ERROR) { delete mf; return res; } mMemFile = mf; return res; }
result Wav::loadogg(File *aReader) { aReader->seek(0); MemoryFile memoryFile; memoryFile.openFileToMem(aReader); int e = 0; stb_vorbis *vorbis = 0; vorbis = stb_vorbis_open_memory(memoryFile.getMemPtr(), memoryFile.length(), &e, 0); if (0 == vorbis) { return FILE_LOAD_FAILED; } stb_vorbis_info info = stb_vorbis_get_info(vorbis); mBaseSamplerate = (float)info.sample_rate; int samples = stb_vorbis_stream_length_in_samples(vorbis); int readchannels = 1; if (info.channels > 1) { readchannels = 2; mChannels = 2; } mData = new float[samples * readchannels]; mSampleCount = samples; samples = 0; while(1) { float **outputs; int n = stb_vorbis_get_frame_float(vorbis, NULL, &outputs); if (n == 0) { break; } if (readchannels == 1) { memcpy(mData + samples, outputs[0],sizeof(float) * n); } else { memcpy(mData + samples, outputs[0],sizeof(float) * n); memcpy(mData + samples + mSampleCount, outputs[1],sizeof(float) * n); } samples += n; } stb_vorbis_close(vorbis); return 0; }
result Wav::loadFile(File *aFile) { if (!aFile) return INVALID_PARAMETER; stop(); MemoryFile mr; result res = mr.openFileToMem(aFile); if (res != SO_NO_ERROR) { return res; } return testAndLoadFile(&mr); }