GAAD (Go Advanced Audio Decoder)

GoDoc Build Status Go Report Card

GAAD (Go Advanced Audio Decoder)

Package currently provides AAC parsing capabilities. This package performs a full parse of AAC-LC and HE-AACv1 bitstreams. Bitstreams with Parametric Stereo (HE-AACv2) are not yet supported, but AAC bitstream data and SBR data will be extracted. The AAC decode from the parsed data to LPCM (.wav) is not yet implemented. Please help us expand and test this library!

AACParser

This package currently supports AAC audio data contained in an ADTS header. All available data is returned in the adts struct and can be accessed as nested objects as presented in the AAC specification. All parameter names should be verbatim from the AAC specification, if you find an issue with this please file a bug or submit a pull request.

AAC Types

Type Description CODEC
AACLC AAC mp4a.40.2
HEAAC AAC + SBR mp4a.40.5
HEAACv2 AAC + SBR + PS mp4a.40.29

where:

  • SBR = Spectral band replication
  • PS = Parametric Stereo

Usage

var []byte buf
buf = <ADTS+AAC data>

// Parsing the buffer
adts, err := gaad.ParseADTS(buf)

// Looping through top level elements and accessing sub-elements
var sbr bool
if adts.Fill_elements != nil {
	for _, e := range adts.Fill_elements {
		if e.Extension_payload != nil &&
			e.Extension_payload.Extension_type == gaad.EXT_SBR_DATA {
			sbr = true
		}
	}
}

VBR vs CBR

VBR (Variable bitrate) and CBR (Constant bitrate) is derived from the bitstream_type attribute in the adif_header section. It is VBR if bitstream_type is true, and CBR otherwise.

References

ISO/IEC STANDARD 14496-3

Title         : Coding of audio-visual objects — Part 3: Audio
File          : ISO_14496-3-4th-Edition.pdf
Edition       : Fourth edition (2009-09-01)
Relevant Sections
    - Page 64   : 1.6.5 Signaling of SBR
    - Page 120  : 1.A.2 AAC Interchange formats
    - Page 489  : 4.4.2 GA bitstream payloads

Related Books

Related Links

Owner
Comcast brings together the best in media and technology to create the world's best entertainment and online experiences
null
Comments
  • Fixes for two of the fuzzing issues

    Fixes for two of the fuzzing issues

    Notes

    I'll preface this by saying I didn't reference the spec for these two issues. The first fix is that the Scale Factor Index table only goes to 11 in the look up table. This fix addresses issue #10

    The second fix just ensures that the Raw_data_block_position array is not accessed out of bound. This addresses issue #9

  • Fixing parse for SBR extension channel pair element

    Fixing parse for SBR extension channel pair element

    When parsing an SBR extension containing an sbr_channel_pair_element, the value of bs_frame_class (from sbr_grid) is overwritten, rather than stored per channel. The value of bs_frame_class is later needed to select the HCB used in sbr_envelope, and may cause a parse error when set incorrectly.

    The test added in this request, TestSbrChannelPairElementParse, run against the current head (7cb3b3c) demonstrates the issue:

    $ go test . -run ^TestSbrChannelPairElementParse  -v
    === RUN   TestSbrChannelPairElementParse
        aacparser_test.go:236: err (sbr extension payload malformed) must be nil
    --- FAIL: TestSbrChannelPairElementParse (0.00s)
    FAIL
    FAIL  github.com/Comcast/gaad 0.008s
    FAIL
    

    Both libfaad and FFmpeg set bs_frame_class per channel:

    Storing bs_frame_class per channel, as it is in this request, passes the aforementioned test and all other package tests.

  • Ignore extensions while not supported, fix misc

    Ignore extensions while not supported, fix misc

    Since we don't support extensions right now I would argue we should just omit them rather than approaching it with no intent to actually parse and use it. I'm running into situations where the parser will get tripped up in the bitstream and try to allocate gigs of memory.

    Additionally:

    • excluded_channels.Additional_excluded_chns was never allocated resulting in a panic
    • Add checks to not allocate the world elsewhere as well
  • Package level vars - which should be constant - mutated in aacwindowgrouping.go

    Package level vars - which should be constant - mutated in aacwindowgrouping.go

    In the following block of code:

    	case ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE, LONG_STOP_SEQUENCE:
    		info.num_windows = 1
    		info.num_window_groups = 1
    		info.window_group_length = make([]uint8, info.num_window_groups)
    		info.window_group_length[info.num_window_groups-1] = 1
    		info.num_swb = num_swb_long_windows[idx][sfi]
    
    		info.sect_sfb_offset = append(info.sect_sfb_offset, swb_offset_long_window[sfi][:info.num_swb])
    		info.swb_offset = swb_offset_long_window[sfi][:info.num_swb]
    
    		// Special cases for 960's final values so we don't have to duplicate tables
    		info.sect_sfb_offset[0] = append(info.sect_sfb_offset[0], framelength)
    		info.swb_offset = append(info.swb_offset, framelength)
    

    The line info.sect_sfb_offset[0] = append(info.sect_sfb_offset[0], framelength) ends up mutating some of the underlying swb_offset... slices. This mutation prevents the code from being thread safe, and may have other impacts. I think the root of the issue is

    The following playground provides an MVCE of an analogous situation: https://play.golang.org/p/BMcQU5-FS5

    I think @jessejlt has an even simpler example.

  • panic: runtime error: index out of range in gaad.(*ADTS).excluded_channels

    panic: runtime error: index out of range in gaad.(*ADTS).excluded_channels

    Hello.

    I found a index out of range bug in gaad.

    Please confirm.

    Thanks.

    reproduce code:

    package gaad
    
    import (
    	"testing"
    )
    
    func TestFuzzCrashers(t *testing.T) {
    
    	var crashers = []string{
    		"\xff\xf10\xdc0\xb8\xad",
    	}
    
    	for _, f := range crashers {
    		ParseADTS([]byte(f))
    	}
    }
    

    Crash Log:

    --- FAIL: TestFuzzCrashers (0.00s)
    panic: runtime error: index out of range [recovered]
    	panic: runtime error: index out of range
    
    goroutine 17 [running]:
    testing.tRunner.func1(0xc42004d5f0)
    	/usr/lib/go-1.8/src/testing/testing.go:622 +0x29d
    panic(0x5337a0, 0x5fbe10)
    	/usr/lib/go-1.8/src/runtime/panic.go:489 +0x2cf
    github.com/Comcast/gaad.(*ADTS).excluded_channels(0xc42004d6c0, 0xc42009b301, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1832 +0x2ca
    github.com/Comcast/gaad.(*ADTS).dynamic_range_info(0xc42004d6c0, 0x4, 0xb)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1787 +0x3f7
    github.com/Comcast/gaad.(*ADTS).extension_payload(0xc42004d6c0, 0x2, 0x4f0006, 0x0, 0x0, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1731 +0x32b
    github.com/Comcast/gaad.(*ADTS).fill_element(0xc42004d6c0, 0x6, 0x6, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1293 +0xbf
    github.com/Comcast/gaad.(*ADTS).raw_data_block(0xc42004d6c0, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1020 +0x269
    github.com/Comcast/gaad.(*ADTS).adts_frame(0xc42004d6c0, 0xc420019800, 0x7)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:796 +0x91
    github.com/Comcast/gaad.ParseADTS(0xc4200b52a0, 0x7, 0x8, 0xc4200b52a0, 0x7, 0x8)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:773 +0xbe
    github.com/Comcast/gaad.TestFuzzCrashers(0xc42004d5f0)
    	/home/karas/go/src/github.com/Comcast/gaad/fuzzer_test.go:14 +0x90
    testing.tRunner(0xc42004d5f0, 0x5647e0)
    	/usr/lib/go-1.8/src/testing/testing.go:657 +0x96
    created by testing.(*T).Run
    	/usr/lib/go-1.8/src/testing/testing.go:697 +0x2ca
    exit status 2
    FAIL	github.com/Comcast/gaad	0.009s
    
  • panic: runtime error: index out of range in gaad.window_grouping

    panic: runtime error: index out of range in gaad.window_grouping

    Hello.

    I found a index out of range bug in gaad.

    Please confirm.

    Thanks.

    reproduce code:

    package gaad
    
    import (
    	"testing"
    )
    
    func TestFuzzCrashers(t *testing.T) {
    
    	var crashers = []string{
    		"\xff\xf10\x850",
    	}
    
    	for _, f := range crashers {
    		ParseADTS([]byte(f))
    	}
    }
    
    

    Crash Log:

    --- FAIL: TestFuzzCrashers (0.00s)
    panic: runtime error: index out of range [recovered]
    	panic: runtime error: index out of range
    
    goroutine 17 [running]:
    testing.tRunner.func1(0xc42004d520)
    	/usr/lib/go-1.8/src/testing/testing.go:622 +0x29d
    panic(0x5337a0, 0x5fbe10)
    	/usr/lib/go-1.8/src/runtime/panic.go:489 +0x2cf
    github.com/Comcast/gaad.window_grouping(0xc420073720, 0x400000c)
    	/home/karas/go/src/github.com/Comcast/gaad/aacwindowgrouping.go:151 +0xe30
    github.com/Comcast/gaad.(*ADTS).ics_info(0xc42004d5f0, 0x0, 0x4f4e00, 0x5e9b00, 0xc4200b52d0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1114 +0x2b9
    github.com/Comcast/gaad.(*ADTS).individual_channel_stream(0xc42004d5f0, 0x0, 0x0, 0x5e9b00, 0xc4200b52c0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1398 +0x3ad
    github.com/Comcast/gaad.(*ADTS).coupling_channel_element(0xc42004d5f0, 0x3, 0x2, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1204 +0x300
    github.com/Comcast/gaad.(*ADTS).raw_data_block(0xc42004d5f0, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1006 +0x8b3
    github.com/Comcast/gaad.(*ADTS).adts_frame(0xc42004d5f0, 0xc420019800, 0x5)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:796 +0x91
    github.com/Comcast/gaad.ParseADTS(0xc4200b52a0, 0x5, 0x8, 0xc4200b52a0, 0x5, 0x8)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:773 +0xbe
    github.com/Comcast/gaad.TestFuzzCrashers(0xc42004d520)
    	/home/karas/go/src/github.com/Comcast/gaad/fuzzer_test.go:14 +0x90
    testing.tRunner(0xc42004d520, 0x5647e0)
    	/usr/lib/go-1.8/src/testing/testing.go:657 +0x96
    created by testing.(*T).Run
    	/usr/lib/go-1.8/src/testing/testing.go:697 +0x2ca
    exit status 2
    FAIL	github.com/Comcast/gaad	0.011s
    
  • panic: runtime error: index out of range in gaad.(*ADTS).adts_header_error_check

    panic: runtime error: index out of range in gaad.(*ADTS).adts_header_error_check

    Hello.

    I found a index out of range bug in gaad.

    Please confirm.

    Thanks.

    reproduce code:

    package gaad
    
    import (
    	"testing"
    )
    
    func TestFuzzCrashers(t *testing.T) {
    
    	var crashers = []string{
    		"\xff\xf00000\x010",
    	}
    
    	for _, f := range crashers {
    		ParseADTS([]byte(f))
    	}
    }
    
    

    Crash Log:

    --- FAIL: TestFuzzCrashers (0.00s)
    panic: runtime error: index out of range [recovered]
    	panic: runtime error: index out of range
    
    goroutine 17 [running]:
    testing.tRunner.func1(0xc42004d380)
    	/usr/lib/go-1.8/src/testing/testing.go:622 +0x29d
    panic(0x5337a0, 0x5fbe10)
    	/usr/lib/go-1.8/src/runtime/panic.go:489 +0x2cf
    github.com/Comcast/gaad.(*ADTS).adts_header_error_check(0xc42004d450)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:895 +0xf8
    github.com/Comcast/gaad.(*ADTS).adts_frame(0xc42004d450, 0xc420019800, 0x8)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:801 +0xd9
    github.com/Comcast/gaad.ParseADTS(0xc4200b52a0, 0x8, 0x8, 0xc4200b52a0, 0x8, 0x8)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:773 +0xbe
    github.com/Comcast/gaad.TestFuzzCrashers(0xc42004d380)
    	/home/karas/go/src/github.com/Comcast/gaad/fuzzer_test.go:14 +0x90
    testing.tRunner(0xc42004d380, 0x5647e0)
    	/usr/lib/go-1.8/src/testing/testing.go:657 +0x96
    created by testing.(*T).Run
    	/usr/lib/go-1.8/src/testing/testing.go:697 +0x2ca
    exit status 2
    FAIL	github.com/Comcast/gaad	0.009s
    
  • panic: runtime error: len out of range in (*BitReader).ReadBitsToByteArray

    panic: runtime error: len out of range in (*BitReader).ReadBitsToByteArray

    Hello.

    I found a len out of range bug in gaad.

    Please confirm.

    Thanks.

    reproduce code:

    package gaad
    
    import (
    	"testing"
    )
    
    func TestFuzzCrashers(t *testing.T) {
    
    	var crashers = []string{
    			"\xff\xf100000\xc3\xdc",
    	}
    
    	for _, f := range crashers {
    		ParseADTS([]byte(f))
    	}
    }
    

    Crash Log:

    --- FAIL: TestFuzzCrashers (0.00s)
    panic: runtime error: makeslice: len out of range [recovered]
    	panic: runtime error: makeslice: len out of range
    
    goroutine 17 [running]:
    testing.tRunner.func1(0xc42004d520)
    	/usr/lib/go-1.8/src/testing/testing.go:622 +0x29d
    panic(0x5337a0, 0xc4200b52e0)
    	/usr/lib/go-1.8/src/runtime/panic.go:489 +0x2cf
    github.com/Comcast/gaad/bitreader.(*BitReader).ReadBitsToByteArray(0xc420019800, 0xfffffffffffffff9, 0x5e9b00, 0xc4200b52d0, 0xc4200b52c0, 0xc420027cf0, 0x4f4ef6)
    	/home/karas/go/src/github.com/Comcast/gaad/bitreader/bitreader.go:129 +0x72
    github.com/Comcast/gaad.(*ADTS).sbr_extension_data(0xc42004d5f0, 0x1, 0x100, 0x0, 0x0, 0xc420019800, 0x40ef01)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1913 +0x1b1
    github.com/Comcast/gaad.(*ADTS).extension_payload(0xc42004d5f0, 0x1, 0x4f0000, 0x0, 0x0, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1740 +0x3d4
    github.com/Comcast/gaad.(*ADTS).fill_element(0xc42004d5f0, 0x0, 0x6, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1293 +0xbf
    github.com/Comcast/gaad.(*ADTS).raw_data_block(0xc42004d5f0, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1020 +0x269
    github.com/Comcast/gaad.(*ADTS).adts_frame(0xc42004d5f0, 0xc420019800, 0x9)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:796 +0x91
    github.com/Comcast/gaad.ParseADTS(0xc4200b52a0, 0x9, 0x10, 0xc4200b52a0, 0x9, 0x10)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:773 +0xbe
    github.com/Comcast/gaad.TestFuzzCrashers(0xc42004d520)
    	/home/karas/go/src/github.com/Comcast/gaad/fuzzer_test.go:14 +0x90
    testing.tRunner(0xc42004d520, 0x5647e0)
    	/usr/lib/go-1.8/src/testing/testing.go:657 +0x96
    created by testing.(*T).Run
    	/usr/lib/go-1.8/src/testing/testing.go:697 +0x2ca
    exit status 2
    FAIL	github.com/Comcast/gaad	0.010s
    
  • panic: runtime error: slice bounds out of range in gaad.freq_derived

    panic: runtime error: slice bounds out of range in gaad.freq_derived

    Hello.

    I found a slice bounds out of range bug in gaad.

    Please confirm.

    Thanks.

    reproduce code:

    package gaad
    
    import (
    	"testing"
    )
    
    func TestFuzzCrashers(t *testing.T) {
    
    	var crashers = []string{
    			"\xff\xf1L0000\xda000000000000" +
    	        "0\xa8\xc3000n\xe40000\xbe\x99\xb10\x96\xfc\xea0" +
    	        "\xddڀ\x000}\xf70000g?\xf10\x00\x00000" +
    	        "\xb200\x8c\xe7Z00\xf7\xca0@\xcb00\xcb#<\xdb1" +
    	        "\xde~0\xfc]",
    	}
    
    	for _, f := range crashers {
    		ParseADTS([]byte(f))
    	}
    }
    

    Crash Log:

    --- FAIL: TestFuzzCrashers (0.00s)
    panic: runtime error: slice bounds out of range [recovered]
    	panic: runtime error: slice bounds out of range
    
    goroutine 17 [running]:
    testing.tRunner.func1(0xc42004d2b0)
    	/usr/lib/go-1.8/src/testing/testing.go:622 +0x29d
    panic(0x5337a0, 0x5fbe20)
    	/usr/lib/go-1.8/src/runtime/panic.go:489 +0x2cf
    github.com/Comcast/gaad.freq_derived(0xc420084380, 0xc401021806)
    	/home/karas/go/src/github.com/Comcast/gaad/aacsbrtables.go:250 +0x487
    github.com/Comcast/gaad.derive_sbr_tables(0xc420084380, 0x60102050c00, 0xc4200b5350, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacsbrtables.go:88 +0x1ac
    github.com/Comcast/gaad.(*ADTS).sbr_extension_data(0xc42004d380, 0x7, 0x102, 0x0, 0x0, 0xc420019800, 0x40ef01)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1903 +0xeb
    github.com/Comcast/gaad.(*ADTS).extension_payload(0xc42004d380, 0x7, 0x4f0002, 0x0, 0x0, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1740 +0x3d4
    github.com/Comcast/gaad.(*ADTS).fill_element(0xc42004d380, 0x2, 0x6, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1293 +0xbf
    github.com/Comcast/gaad.(*ADTS).raw_data_block(0xc42004d380, 0x0, 0x0)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:1020 +0x269
    github.com/Comcast/gaad.(*ADTS).adts_frame(0xc42004d380, 0xc420019800, 0x55)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:796 +0x91
    github.com/Comcast/gaad.ParseADTS(0xc420017b00, 0x55, 0x60, 0xc420017b00, 0x55, 0x60)
    	/home/karas/go/src/github.com/Comcast/gaad/aacparser.go:773 +0xbe
    github.com/Comcast/gaad.TestFuzzCrashers(0xc42004d2b0)
    	/home/karas/go/src/github.com/Comcast/gaad/fuzzer_test.go:18 +0x90
    testing.tRunner(0xc42004d2b0, 0x564830)
    	/usr/lib/go-1.8/src/testing/testing.go:657 +0x96
    created by testing.(*T).Run
    	/usr/lib/go-1.8/src/testing/testing.go:697 +0x2ca
    exit status 2
    FAIL	github.com/Comcast/gaad	0.005s
    
Related tags
Package flac provides access to FLAC (Free Lossless Audio Codec) streams.

flac This package provides access to FLAC (Free Lossless Audio Codec) streams. Documentation Documentation provided by GoDoc. flac: provides access to

Jan 5, 2023
Go tools for audio processing & creation ?

GoAudio ? GoAudio is an audio processing library, currently supporting WAVE files, although some tools such as the synth and breakpoints are encoding

Dec 23, 2022
Mini audio library

malgo Go bindings for miniaudio library. Requires cgo but does not require linking to anything on the Windows/macOS and it links only -ldl on Linux/BS

Dec 31, 2022
Sequence-based Go-native audio mixer for music apps

Mix https://github.com/go-mix/mix Sequence-based Go-native audio mixer for music apps See demo/demo.go: package main import ( "fmt" "os" "time"

Dec 1, 2022
Go bindings for the PortAudio audio I/O library

portaudio This package provides an interface to the PortAudio audio I/O library. See the package documentation for details. To build this package you

Jan 1, 2023
Go package capable of generating waveform images from audio streams. MIT Licensed.

waveform Go package capable of generating waveform images from audio streams. MIT Licensed. This library supports any audio streams which the azul3d/e

Nov 17, 2022
CLI audio player written in go.
CLI audio player written in go.

A very minimal CLI audio player.

Dec 13, 2022
alto is a program built for audio management.
alto is a program built for audio management.

alto, a music organizer alto is a program built for audio management. It's purpose is to provide the user the means to create a path construct to move

Oct 10, 2022
Terrible Audio Downloader

Terrible Audio Downloader This is just a small go project I did for myself, to manage my audio library to get away from spotify. All it does is downlo

Oct 30, 2021
Audio visualizer in Go
Audio visualizer in Go

demo_audio_visualizer Simple audio visualizer in Go Used libraries: raylib-go go-mp3 oto go-dsp To disable the additional console window on Windows OS

Dec 4, 2022
A "native" ogg vorbis decoder for Go (uses inline stb_vorbis)

vorbis This Go package provides a "native" ogg vorbis decoder, but still requires cgo, as it uses inline code from stb_vorbis. Someday, it won't. The

Oct 24, 2022
Local-audio - Web walking audio tour platform proof-of-concept

Goal: Proof of concept for a Web Audio walk platform Data retention dynamdo db "time to live" expires in 1 day from creation of record set in add.go s

Jan 9, 2022
Nfc-sun-decoder - A Decoder for NXP 424 DNA SUN (Secure Unique) messages

NFC SUN Decoder A Decoder for NXP 424 DNA SUN (Secure Unique) messages This library makes decoding 424 DNA SUN messages easier. While the 424 DNA chip

Aug 24, 2022
COBS implementation in Go (Decoder) and C (Encoder & Decoder) with tests.

COBS Table of Contents About The project COBS Specification Getting Started 3.1. Prerequisites 3.2. Installation 3.3. Roadmap Contributing License Con

May 22, 2022
Package flac provides access to FLAC (Free Lossless Audio Codec) streams.

flac This package provides access to FLAC (Free Lossless Audio Codec) streams. Documentation Documentation provided by GoDoc. flac: provides access to

Jan 5, 2023
Go tools for audio processing & creation ?

GoAudio ? GoAudio is an audio processing library, currently supporting WAVE files, although some tools such as the synth and breakpoints are encoding

Dec 23, 2022
Mini audio library

malgo Go bindings for miniaudio library. Requires cgo but does not require linking to anything on the Windows/macOS and it links only -ldl on Linux/BS

Dec 31, 2022
Sequence-based Go-native audio mixer for music apps

Mix https://github.com/go-mix/mix Sequence-based Go-native audio mixer for music apps See demo/demo.go: package main import ( "fmt" "os" "time"

Dec 1, 2022
Go bindings for the PortAudio audio I/O library

portaudio This package provides an interface to the PortAudio audio I/O library. See the package documentation for details. To build this package you

Jan 1, 2023
Go package capable of generating waveform images from audio streams. MIT Licensed.

waveform Go package capable of generating waveform images from audio streams. MIT Licensed. This library supports any audio streams which the azul3d/e

Nov 17, 2022