riffbin

package module
v0.0.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2022 License: MIT Imports: 6 Imported by: 2

README

github.com/karupanerura/riffbin Go Reference codecov.io

Go module implementing for RIFF binary format.

Features

  • Construct RIFF data structure
  • Write RIFF data structure
    • Can write RIFF data from io.Reader
  • Parse RIFF binary to data structure

Motivation

There has never been a library that can be used without pre-determining the binary size in Go.

Examples

Example1: write WAVE file

_, err := riffbin.NewCompletedChunkWriter(w).Write(&riffbin.RIFFChunk{
	FormType: [4]byte{'W', 'A', 'V', 'E'},
	Payload: []riffbin.Chunk{
		&riffbin.CompletedSubChunk{
			ID: [4]byte{'f', 'm', 't', ' '},
			Payload: []byte{
				0x01, 0x00, // Compression Code (Linear PCM)
				0x01, 0x00, // Number of channels (Monoral)
				0x44, 0xAC, 0x00, 0x00, // Sample rate (44.1Hz)
				0x44, 0xAC, 0x00, 0x00, // Average bytes per second (44.1Hz/Monoral)
				0x01, 0x00, // Block align (8bit/Monoral)
				0x08, 0x00, // Significant bits per sample (8bit)
			},
		},
		// very short sin wave
		&riffbin.CompletedSubChunk{
			ID:		 [4]byte{'d', 'a', 't', 'a'},
			Payload: []byte{0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77},
		},
	},
})

Example2: write WAVE file from io.Reader

w, err := riffbin.NewIncompleteChunkWriter(f)
if err != nil {
	panic(err)
}

_, err = w.Write(&riffbin.RIFFChunk{
	FormType: [4]byte{'W', 'A', 'V', 'E'},
	Payload: []riffbin.Chunk{
		&riffbin.CompletedSubChunk{
			ID: [4]byte{'f', 'm', 't', ' '},
			Payload: []byte{
				0x01, 0x00, // Compression Code (Linear PCM)
				0x01, 0x00, // Number of channels (Monoral)
				0x44, 0xAC, 0x00, 0x00, // Sample rate (44.1Hz)
				0x44, 0xAC, 0x00, 0x00, // Average bytes per second (44.1Hz/Monoral)
				0x01, 0x00, // Block align (8bit/Monoral)
				0x08, 0x00, // Significant bits per sample (8bit)
			},
		},
		riffbin.NewIncompleteSubChunk([4]byte{'d', 'a', 't', 'a'}, r),
	},
})

Documentation

Index

Examples

Constants

View Source
const (
	HeaderBytes = 8
)

Variables

View Source
var (
	// ErrInvalidFormat is an error for invalid RIFF file format.
	ErrInvalidFormat = errors.New("invlaid format")
)
View Source
var ErrUnexpectedIncompleteChunk = errors.New("unexpected incomplete chunk")

Functions

This section is empty.

Types

type Chunk

type Chunk interface {
	// ChunkID is the chunk ID. this must be 4 byte and must not be modified.
	ChunkID() []byte

	// BodySize is byte length of the chunk body.
	BodySize() uint32
}

Chunk is a chunk of RIFF spec

type ChunkWriter

type ChunkWriter interface {
	// Write writes the RIFF message to the underlying data stream.
	// It returns the number of bytes written and any error encountered that caused the write to stop early. (same as Write of io.Writer)
	Write(*RIFFChunk) (int64, error)
}

ChunkWriter is a interface for RIFF chunk writer.

type CompletedChunkWriter

type CompletedChunkWriter struct {
	// contains filtered or unexported fields
}

CompletedChunkWriter is a RIFF chunk writer for the completed chunk.

func NewCompletedChunkWriter

func NewCompletedChunkWriter(w io.Writer) *CompletedChunkWriter

func (*CompletedChunkWriter) Write

func (w *CompletedChunkWriter) Write(c *RIFFChunk) (int64, error)

Write writes the RIFF message to the underlying data stream. It returns the number of bytes written and any error encountered that caused the write to stop early. (same as Write of io.Writer)

Example
package main

import (
	"encoding/base64"
	"os"

	"github.com/karupanerura/riffbin"
)

func main() {
	encoder := base64.NewEncoder(base64.StdEncoding, os.Stdout)
	_, err := riffbin.NewCompletedChunkWriter(encoder).Write(&riffbin.RIFFChunk{
		FormType: [4]byte{'W', 'A', 'V', 'E'},
		Payload: []riffbin.Chunk{
			&riffbin.OnMemorySubChunk{
				ID: [4]byte{'f', 'm', 't', ' '},
				Payload: []byte{
					0x01, 0x00, // Compression Code (Linear PCM)
					0x01, 0x00, // Number of channels (Monoral)
					0x44, 0xAC, 0x00, 0x00, // Sample rate (44.1Hz)
					0x44, 0xAC, 0x00, 0x00, // Average bytes per second (44.1Hz/Monoral)
					0x01, 0x00, // Block align (8bit/Monoral)
					0x08, 0x00, // Significant bits per sample (8bit)
				},
			},
			// very short sin wave
			&riffbin.OnMemorySubChunk{
				ID:      [4]byte{'d', 'a', 't', 'a'},
				Payload: []byte{0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77, 0x7f, 0x87, 0x8f, 0x97, 0x9f, 0xa6, 0xae, 0xb5, 0xbc, 0xc3, 0xca, 0xd0, 0xd6, 0xdc, 0xe1, 0xe6, 0xeb, 0xef, 0xf2, 0xf6, 0xf8, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf2, 0xef, 0xeb, 0xe6, 0xe1, 0xdc, 0xd6, 0xd0, 0xca, 0xc3, 0xbc, 0xb5, 0xae, 0xa6, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x77, 0x6f, 0x67, 0x5f, 0x58, 0x50, 0x49, 0x42, 0x3b, 0x34, 0x2e, 0x28, 0x22, 0x1d, 0x18, 0x13, 0x0f, 0x0c, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0c, 0x0f, 0x13, 0x18, 0x1d, 0x22, 0x28, 0x2e, 0x34, 0x3b, 0x42, 0x49, 0x50, 0x58, 0x5f, 0x67, 0x6f, 0x77},
			},
		},
	})
	if err != nil {
		panic(err)
	}

	err = encoder.Close()
	if err != nil {
		panic(err)
	}

}
Output:
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

type InStreamSubChunk added in v0.0.6

type InStreamSubChunk struct {
	ID [idBytes]byte
	*io.SectionReader
}

InStreamSubChunk is a sub-chunk with the payload on io.SeekReader

func (*InStreamSubChunk) BodySize added in v0.0.6

func (c *InStreamSubChunk) BodySize() uint32

func (*InStreamSubChunk) ChunkID added in v0.0.6

func (c *InStreamSubChunk) ChunkID() []byte

func (*InStreamSubChunk) Incomplete added in v0.0.6

func (c *InStreamSubChunk) Incomplete() bool

type IncompleteChunkWriter

type IncompleteChunkWriter struct {
	// contains filtered or unexported fields
}

IncompleteChunkWriter is a RIFF chunk writer for the incomplete chunk.

func NewIncompleteChunkWriter

func NewIncompleteChunkWriter(w io.WriteSeeker) (*IncompleteChunkWriter, error)

NewIncompleteChunkWriter creates a new IncompleteChunkWriter.

func (*IncompleteChunkWriter) Write

func (w *IncompleteChunkWriter) Write(c *RIFFChunk) (n int64, err error)

Write writes the RIFF message to the underlying data stream, and re-write the bytes of the all chunk headers size to fix incomplete body bytes by random write. It returns the number of bytes written and any error encountered that caused the write to stop early. (same as Write of io.Writer)

Example
package main

import (
	"io"
	"math"
	"os"
	"os/exec"
	"runtime"

	"github.com/karupanerura/riffbin"
)

type callbackReader func([]byte) (int, error)

func (r callbackReader) Read(p []byte) (int, error) {
	return r(p)
}

func main() {
	f, err := os.CreateTemp("", "riffbin")
	if err != nil {
		panic(err)
	}
	defer os.Remove(f.Name())

	w, err := riffbin.NewIncompleteChunkWriter(f)
	if err != nil {
		panic(err)
	}

	_, err = w.Write(&riffbin.RIFFChunk{
		FormType: [4]byte{'W', 'A', 'V', 'E'},
		Payload: []riffbin.Chunk{
			&riffbin.OnMemorySubChunk{
				ID: [4]byte{'f', 'm', 't', ' '},
				Payload: []byte{
					0x01, 0x00, // Compression Code (Linear PCM)
					0x01, 0x00, // Number of channels (Monoral)
					0x44, 0xAC, 0x00, 0x00, // Sample rate (44.1Hz)
					0x44, 0xAC, 0x00, 0x00, // Average bytes per second (44.1Hz/Monoral)
					0x01, 0x00, // Block align (8bit/Monoral)
					0x08, 0x00, // Significant bits per sample (8bit)
				},
			},
			// sin wave
			riffbin.NewIncompleteSubChunk([4]byte{'d', 'a', 't', 'a'}, callbackReader(func() func(p []byte) (n int, err error) {
				max := 1000 * int(math.Ceil(44100/440))
				i := 0
				return func(p []byte) (n int, err error) {
					for n < len(p) && i < max {
						p[n] = byte(math.Floor((float64(i) / float64(max)) * 255.0 * (1.0 + math.Sin(2.0*math.Pi*float64(i)/(44100/440))) / 2.0))
						n++
						i++
					}
					if n == 0 {
						err = io.EOF
					}
					return
				}
			}())),
		},
	})
	if err != nil {
		panic(err)
	}

	// preview on macOS
	if os.Getenv("DEBUG_TEST_PLAY") != "" && runtime.GOOS == "darwin" {
		err = exec.Command("afplay", f.Name()).Run()
		if err != nil {
			panic(err)
		}
	}

}

type IncompleteSubChunk

type IncompleteSubChunk struct {
	// contains filtered or unexported fields
}

IncompleteSubChunk is a sub-chunk with the incomplete payload provided from io.Reader.

func NewIncompleteSubChunk

func NewIncompleteSubChunk(id [idBytes]byte, r io.Reader) *IncompleteSubChunk

func (*IncompleteSubChunk) BodySize

func (c *IncompleteSubChunk) BodySize() uint32

func (*IncompleteSubChunk) ChunkID

func (c *IncompleteSubChunk) ChunkID() []byte

func (*IncompleteSubChunk) Incomplete added in v0.0.5

func (c *IncompleteSubChunk) Incomplete() bool

func (*IncompleteSubChunk) Read added in v0.0.5

func (c *IncompleteSubChunk) Read(p []byte) (n int, err error)

func (*IncompleteSubChunk) WriteTo added in v0.0.5

func (c *IncompleteSubChunk) WriteTo(w io.Writer) (n int64, err error)

type ListChunk

type ListChunk struct {
	ListType [typeBytes]byte
	Payload  []Chunk
}

ListChunk is a LIST chunk.

func (*ListChunk) BodySize

func (c *ListChunk) BodySize() (size uint32)

func (*ListChunk) ChunkID

func (c *ListChunk) ChunkID() []byte

type OnMemorySubChunk added in v0.0.5

type OnMemorySubChunk struct {
	ID      [idBytes]byte
	Payload []byte
	// contains filtered or unexported fields
}

OnMemorySubChunk is a sub-chunk with the payload on memory.

func (*OnMemorySubChunk) BodySize added in v0.0.5

func (c *OnMemorySubChunk) BodySize() uint32

func (*OnMemorySubChunk) ChunkID added in v0.0.5

func (c *OnMemorySubChunk) ChunkID() []byte

func (*OnMemorySubChunk) Incomplete added in v0.0.5

func (c *OnMemorySubChunk) Incomplete() bool

func (*OnMemorySubChunk) Read added in v0.0.5

func (c *OnMemorySubChunk) Read(p []byte) (int, error)

func (*OnMemorySubChunk) WriteTo added in v0.0.5

func (c *OnMemorySubChunk) WriteTo(w io.Writer) (int64, error)

type PartialReader added in v0.0.6

type PartialReader interface {
	io.ReadSeeker
	io.ReaderAt
}

type RIFFChunk

type RIFFChunk struct {
	FormType [typeBytes]byte
	Payload  []Chunk
}

RIFFChunk is a RIFF chunk. This is must be the root chunk.

func ReadFull

func ReadFull(r io.Reader) (*RIFFChunk, error)

ReadFull reads RIFF binary from io.Reader. It creates *RIFFChunk with *OnMemorySubChunk for sub-chunks.

Example
package main

import (
	"encoding/base64"
	"fmt"
	"strings"

	"github.com/karupanerura/riffbin"
)

func main() {
	const binary = "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"
	decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(binary))
	riffChunk, err := riffbin.ReadFull(decoder)
	if err != nil {
		panic(err)
	}

	fmt.Printf("ID = %q\n", string(riffChunk.ChunkID()))
	fmt.Printf("Size = %d\n", riffChunk.BodySize())
	for i, p := range riffChunk.Payload {
		fmt.Printf("[%d]ID = %q\n", i, string(p.ChunkID()))
		fmt.Printf("[%d]Size = %d\n", i, p.BodySize())
	}

}
Output:
ID = "RIFF"
Size = 2036
[0]ID = "fmt "
[0]Size = 16
[1]ID = "data"
[1]Size = 2000

func ReadSections added in v0.0.6

func ReadSections(r PartialReader) (*RIFFChunk, error)

ReadSections reads RIFF binary from io.ReadSeeker to use less memory than ReadFull. It creates *RIFFChunk with *InStreamSubChunk for sub-chunks.

Example
package main

import (
	"bytes"
	"encoding/base64"
	"fmt"

	"github.com/karupanerura/riffbin"
)

func main() {
	const binary = "UklGRvQHAABXQVZFZm10IBAAAAABAAEARKwAAESsAAABAAgAZGF0YdAHAAB/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvd3+Hj5efpq61vMPK0Nbc4ebr7/L2+Pr8/f7//v38+vj28u/r5uHc1tDKw7y1rqafl4+Hf3dvZ19YUElCOzQuKCIdGBMPDAgGBAIBAAAAAQIEBggMDxMYHSIoLjQ7QklQWF9nb3d/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvd3+Hj5efpq61vMPK0Nbc4ebr7/L2+Pr8/f7//v38+vj28u/r5uHc1tDKw7y1rqafl4+Hf3dvZ19YUElCOzQuKCIdGBMPDAgGBAIBAAAAAQIEBggMDxMYHSIoLjQ7QklQWF9nb3d/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvd3+Hj5efpq61vMPK0Nbc4ebr7/L2+Pr8/f7//v38+vj28u/r5uHc1tDKw7y1rqafl4+Hf3dvZ19YUElCOzQuKCIdGBMPDAgGBAIBAAAAAQIEBggMDxMYHSIoLjQ7QklQWF9nb3d/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvd3+Hj5efpq61vMPK0Nbc4ebr7/L2+Pr8/f7//v38+vj28u/r5uHc1tDKw7y1rqafl4+Hf3dvZ19YUElCOzQuKCIdGBMPDAgGBAIBAAAAAQIEBggMDxMYHSIoLjQ7QklQWF9nb3d/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvd3+Hj5efpq61vMPK0Nbc4ebr7/L2+Pr8/f7//v38+vj28u/r5uHc1tDKw7y1rqafl4+Hf3dvZ19YUElCOzQuKCIdGBMPDAgGBAIBAAAAAQIEBggMDxMYHSIoLjQ7QklQWF9nb3d/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvd3+Hj5efpq61vMPK0Nbc4ebr7/L2+Pr8/f7//v38+vj28u/r5uHc1tDKw7y1rqafl4+Hf3dvZ19YUElCOzQuKCIdGBMPDAgGBAIBAAAAAQIEBggMDxMYHSIoLjQ7QklQWF9nb3d/h4+Xn6autbzDytDW3OHm6+/y9vj6/P3+//79/Pr49vLv6+bh3NbQysO8ta6mn5ePh393b2dfWFBJQjs0LigiHRgTDwwIBgQCAQAAAAECBAYIDA8TGB0iKC40O0JJUFhfZ293f4ePl5+mrrW8w8rQ1tzh5uvv8vb4+vz9/v/+/fz6+Pby7+vm4dzW0MrDvLWupp+Xj4d/d29nX1hQSUI7NC4oIh0YEw8MCAYEAgEAAAABAgQGCAwPExgdIiguNDtCSVBYX2dvdw=="
	decodedBin, err := base64.StdEncoding.DecodeString(binary)
	if err != nil {
		panic(err)
	}

	riffChunk, err := riffbin.ReadSections(bytes.NewReader(decodedBin))
	if err != nil {
		panic(err)
	}

	fmt.Printf("ID = %q\n", string(riffChunk.ChunkID()))
	fmt.Printf("Size = %d\n", riffChunk.BodySize())
	for i, p := range riffChunk.Payload {
		fmt.Printf("[%d]ID = %q\n", i, string(p.ChunkID()))
		fmt.Printf("[%d]Size = %d\n", i, p.BodySize())
	}

}
Output:
ID = "RIFF"
Size = 2036
[0]ID = "fmt "
[0]Size = 16
[1]ID = "data"
[1]Size = 2000

func (*RIFFChunk) BodySize

func (c *RIFFChunk) BodySize() (size uint32)

func (*RIFFChunk) ChunkID

func (c *RIFFChunk) ChunkID() []byte

type SubChunk added in v0.0.5

type SubChunk interface {
	Chunk
	io.Reader

	// Incomplete returns true if the SubChunk payload is fluid, or not it returns false.
	// Incomplete sub-chunk is only after the payload have been read that the BodySize is determined.
	// Completed sub-chunk have a stable size of the payload.
	Incomplete() bool
}

Directories

Path Synopsis
cmd
riffdump command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL