func Decompress(infile, outfile io.ReadWriteSeeker, passwd string, cb Callback) (err error) { decoder := NewDecoder(infile) if len(passwd) > 0 { decoder.SetPassword(passwd) } info := Info{} if err = decoder.GetInfo(&info, 0); err != nil { return } smpSize := info.nch * ((info.bps + 7) / 8) dataSize := info.samples * smpSize waveHdr := WaveHeader{ chunkId: riffSign, chunkSize: dataSize + 36, format: waveSign, subchunkId: fmtSign, subchunkSize: 16, audioFormat: 1, numChannels: uint16(info.nch), sampleRate: info.sps, bitsPerSample: uint16(info.bps), byteRate: info.sps * smpSize, blockAlign: uint16(smpSize), } if err = waveHdr.Write(outfile, dataSize); err != nil { return } bufSize := pcmBufferLength * smpSize buffer := make([]byte, bufSize) var writeLen int for { if writeLen = int(uint32(decoder.ProcessStream(buffer, cb)) * smpSize); writeLen == 0 { break } buf := buffer[:writeLen] if writeLen, err = outfile.Write(buf); err != nil { return } else if writeLen != len(buf) { err = errPartialWritten return } } return }
func AppendAdder(genome io.ReadWriteSeeker, gene genome.Gene, geneMap genome.GeneMap) (pos int64, err os.Error) { //go to the end of the file pos, err = genome.Seek(0, 2) length, err := genome.Write(gene) if err != nil { panic(err.String()) } genome.Seek(pos, 0) test := make([]byte, length) genome.Read(test) if !bytes.Equal(gene.GetData(), test) { panic("apperder broken") } return }