ADPCM: added programs to test encoding and decoding of raw PCM files

This commit is contained in:
Trek H 2019-02-11 10:10:12 +10:30
parent f03c8052d6
commit 5a2129f00f
2 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,59 @@
package main
import (
"flag"
"fmt"
"io/ioutil"
"bitbucket.org/ausocean/av/cmd/adpcm"
)
func main() {
var inPath string
var outPath string
var nChannels int
var rate int
var bps int
flag.StringVar(&inPath, "in", "encoded.adpcm", "file path of input")
flag.StringVar(&outPath, "out", "decoded.pcm", "file path of output data")
flag.IntVar(&nChannels, "channels", 1, "number of channels in adpcm data")
flag.IntVar(&rate, "rate", 8000, "number of channels in adpcm data")
flag.IntVar(&bps, "bps", 16, "number of channels in adpcm data")
flag.Parse()
//read adpcm
comp, err := ioutil.ReadFile(inPath)
if err != nil {
panic(err)
}
fmt.Println("Read ADPCM from " + inPath + ". First 8 bytes: ")
for i := 0; i < len(comp) && i < 16; i++ {
fmt.Print(comp[i], ", ")
}
fmt.Println()
//decode adpcm
var decoded []byte
start := 0
for i := 0; i < len(comp); i++ {
if i%256 == 255 {
block := comp[start : i+1]
decBlock, err := adpcm.DecodeBlock(block)
if err != nil {
//todo: use correct logging of error
panic(err)
}
decoded = append(decoded, decBlock...)
start = i + 1
}
}
// save pcm to file
err = ioutil.WriteFile(outPath, decoded, 0644)
if err != nil {
panic(err)
}
fmt.Println("Saved PCM to " + outPath + ". First 16 bytes: ")
for i := 0; i < len(decoded) && i < 16; i++ {
fmt.Print(decoded[i], " ")
}
fmt.Println()
}

View File

@ -0,0 +1,53 @@
package main
import (
"flag"
"io/ioutil"
"bitbucket.org/ausocean/av/cmd/adpcm"
)
func main() {
var inPath string
var adpcmPath string
flag.StringVar(&inPath, "in", "data.pcm", "file path of input data")
flag.StringVar(&adpcmPath, "out", "encoded.adpcm", "file path of output")
flag.Parse()
//read pcm
pcm, err := ioutil.ReadFile(inPath)
if err != nil {
panic(err)
}
//encode adpcm
var comp []byte
start := 0
// tCount := 0
// tNum := 1
for i := 0; i < len(pcm); i++ {
if i%1010 == 1009 {
block := pcm[start : i+1]
// if tCount < tNum {
// fmt.Println(block[0:16])
// tCount++
// }
encBlock, err := adpcm.EncodeBlock(block)
if err != nil {
//todo: use correct logging of error
panic(err)
}
comp = append(comp, encBlock...)
start = i + 1
}
}
// save adpcm to file
err = ioutil.WriteFile(adpcmPath, comp, 0644)
if err != nil {
panic(err)
}
// fmt.Println("Saved ADPCM to " + adpcmPath + ". First 16 bytes: ")
// for i := 0; i < len(comp) && i < 16; i++ {
// fmt.Println(comp[i])
// }
// fmt.Println()
}