void CompressScummSan::encodeSanWaveWithLame(const std::string &filename) { std::string fbuf = filename + ".raw"; Common::Filename fbuf2(filename.c_str()); fbuf2.setExtension(".mp3"); encodeAudio(fbuf.c_str(), true, 22050, fbuf2.getFullPath().c_str(), AUDIO_MP3); }
void CompressionTool::extractAndEncodeWAV(const char *outName, Common::File &input, AudioFormat compMode) { unsigned int length; char fbuf[2048]; size_t size; input.seek(-4, SEEK_CUR); length = input.readUint32LE(); length += 8; input.seek(-8, SEEK_CUR); /* Copy the WAV data to a temporary file */ Common::File f(outName, "wb"); while (length > 0) { size = input.read_noThrow(fbuf, length > sizeof(fbuf) ? sizeof(fbuf) : length); if (size <= 0) break; length -= (int)size; f.write(fbuf, size); } f.close(); /* Convert the WAV temp file to OGG/MP3 */ encodeAudio(outName, false, -1, tempEncoded, compMode); }
void CompressSword2::execute() { int j; uint32 indexSize; uint32 totalSize; uint32 length; Common::Filename inpath(_inputPaths[0].path); Common::Filename &outpath = _outputPath; if (outpath.empty()) // Extensions change between the in/out files, so we can use the same directory outpath = inpath; switch (_format) { case AUDIO_MP3: _audioOutputFilename = TEMP_MP3; outpath.setExtension(".cl3"); break; case AUDIO_VORBIS: _audioOutputFilename = TEMP_OGG; outpath.setExtension(".clg"); break; case AUDIO_FLAC: _audioOutputFilename = TEMP_FLAC; outpath.setExtension(".clf"); break; default: throw ToolException("Unknown audio format"); break; } _input.open(inpath, "rb"); indexSize = _input.readUint32LE(); totalSize = 12 * (indexSize + 1); if (_input.readUint32BE() != 0xfff0fff0) { error("This doesn't look like a cluster file"); } _output_idx.open(TEMP_IDX, "wb"); _output_snd.open(TEMP_DAT, "wb"); _output_idx.writeUint32LE(indexSize); _output_idx.writeUint32BE(0xfff0fff0); _output_idx.writeUint32BE(0xfff0fff0); for (int i = 0; i < (int)indexSize; i++) { // Update progress, this loop is where most of the time is spent updateProgress(i, indexSize); uint32 pos; uint32 enc_length; _input.seek(8 * (i + 1), SEEK_SET); pos = _input.readUint32LE(); length = _input.readUint32LE(); if (pos != 0 && length != 0) { uint16 prev; Common::File f(TEMP_WAV, "wb"); /* * The number of decodeable 16-bit samples is one less * than the length of the resource. */ length--; /* * Back when this tool was written, encodeAudio() had * no way of encoding 16-bit data, so it was simpler to * output a WAV file. */ f.writeUint32BE(0x52494646); /* "RIFF" */ f.writeUint32LE(2 * length + 36); f.writeUint32BE(0x57415645); /* "WAVE" */ f.writeUint32BE(0x666d7420); /* "fmt " */ f.writeUint32LE(16); f.writeUint16LE(1); /* PCM */ f.writeUint16LE(1); /* mono */ f.writeUint32LE(22050); /* sample rate */ f.writeUint32LE(44100); /* bytes per second */ f.writeUint16LE(2); /* basic block size */ f.writeUint16LE(16); /* sample width */ f.writeUint32BE(0x64617461); /* "data" */ f.writeUint32LE(2 * length); _input.seek(pos, SEEK_SET); /* * The first sample is stored uncompressed. Subsequent * samples are stored as some sort of 8-bit delta. */ prev = _input.readUint16LE(); f.writeUint16LE(prev); for (j = 1; j < (int)length; j++) { byte data; uint16 out; data = _input.readByte(); if (GetCompressedSign(data)) out = prev - (GetCompressedAmplitude(data) << GetCompressedShift(data)); else out = prev + (GetCompressedAmplitude(data) << GetCompressedShift(data)); f.writeUint16LE(out); prev = out; } f.close(); encodeAudio(TEMP_WAV, false, -1, tempEncoded, _format); enc_length = append_to_file(_output_snd, tempEncoded); _output_idx.writeUint32LE(totalSize); _output_idx.writeUint32LE(length); _output_idx.writeUint32LE(enc_length); totalSize = totalSize + enc_length; } else { _output_idx.writeUint32LE(0); _output_idx.writeUint32LE(0); _output_idx.writeUint32LE(0); } } _output_snd.close(); _output_idx.close(); Common::File output(outpath, "wb"); append_to_file(output, TEMP_IDX); append_to_file(output, TEMP_DAT); output.close(); Common::removeFile(TEMP_DAT); Common::removeFile(TEMP_IDX); Common::removeFile(TEMP_MP3); Common::removeFile(TEMP_OGG); Common::removeFile(TEMP_FLAC); Common::removeFile(TEMP_WAV); }
void AVPacketEncoder::encode(AudioPacket& packet) { encodeAudio((unsigned char*)packet.data(), packet.size(), packet.frameSize, (UInt64)packet.time); //encodeAudio(((AudioDecoderContext*)packet.opaque)->frame); }