Ejemplo n.º 1
0
Archivo: decoder.go Proyecto: zyxar/tta
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
}
Ejemplo n.º 2
0
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

}