Git Product home page Git Product logo

portaudio-go's Introduction

portaudio-go

The package provides Go bindings for PortAudio.
All the code has automatically been generated with rules defined in portaudio.yml.

Usage

$ brew install portaudio
(or use your package manager)

$ go get github.com/xlab/portaudio-go/portaudio

See example#1.

Rebuilding the package

You will need to get the cgogen tool installed first.

$ git clone https://github.com/xlab/portaudio-go && cd portaudio-go
$ make clean
$ make

portaudio-go's People

Contributors

xlab avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

portaudio-go's Issues

cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void

trying to a make and then go build:

./portaudio.go:148:135: cannot use _cgo0 (type *_Ctype_void) as type *unsafe.Pointer in argument to _Cfunc_Pa_OpenStream
./portaudio.go:163:145: cannot use _cgo0 (type *_Ctype_void) as type *unsafe.Pointer in argument to _Cfunc_Pa_OpenDefaultStream
./portaudio.go:170:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:178:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:187:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:195:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:203:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:211:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:219:28: cannot convert unsafe.Pointer(stream) (type unsafe.Pointer) to type _Ctype_void
./portaudio.go:219:28: too many errors

Seems related to xlab/pocketsphinx-go#14

(running on mac Catalina, go 1.15, port audio installed via brew)

How to disable portaudio debug prints?

After call:

portaudio.Initialize()

Will print a lot of log to the console, looks like:

ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:961:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

How to disable or re-route these log?
I found https://stackoverflow.com/questions/24778998/how-to-disable-or-re-route-alsa-lib-logging

Error when callback twice

package main

import (
	"io"
	"log"
	"os"
	"sync"
	"unsafe"

	"github.com/xlab/portaudio-go/portaudio"
	"github.com/youpy/go-wav"
)

const (
	samplesPerChannel = 2048
)

func main() {
	if err := portaudio.Initialize(); paError(err) {
		log.Fatalln("PortAudio init error:", paErrorText(err))
	}

	defer func() {
		if err := portaudio.Terminate(); paError(err) {
			log.Println("PortAudio term error:", paErrorText(err))
		}
	}()
	play("./t.wav")
	play("./t.wav")
}

func play(filePath string) {
	file, err := os.Open(filePath)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	reader := wav.NewReader(file)
	info, err := reader.Format()
	if err != nil {
		log.Fatal(err)
	}

	samplesOut := make(chan [][]float32)

	go func() {
		var frame [][]float32
		for {
			samples, err := reader.ReadSamples()
			if err == io.EOF {
				samplesOut <- frame
				close(samplesOut)
				break
			}

			for _, sample := range samples {
				frame = append(frame, []float32{float32(reader.FloatValue(sample, 0))})
				if len(frame)%samplesPerChannel == 0 {
					samplesOut <- frame
					frame = [][]float32{}
				}
			}
		}
	}()

	var wg sync.WaitGroup
	var stream *portaudio.Stream
	callback := paCallback(&wg, int(info.NumChannels), samplesOut)
	if err := portaudio.OpenDefaultStream(&stream, 0, int32(info.NumChannels), portaudio.PaFloat32, float64(info.SampleRate), samplesPerChannel, callback, nil); paError(err) {
		log.Fatalln("PortAudio error:", paErrorText(err))
	}
	defer func() {
		if err := portaudio.CloseStream(stream); paError(err) {
			log.Println("[WARN] PortAudio error:", paErrorText(err))
		}
	}()

	if err := portaudio.StartStream(stream); paError(err) {
		log.Fatalln("PortAudio error:", paErrorText(err))
	}
	defer func() {
		if err := portaudio.StopStream(stream); paError(err) {
			log.Fatalln("[WARN] PortAudio error:", paErrorText(err))
		}
	}()

	wg.Wait()
}

func paError(err portaudio.Error) bool {
	return portaudio.ErrorCode(err) != portaudio.PaNoError
}

func paErrorText(err portaudio.Error) string {
	return portaudio.GetErrorText(err)
}

func paCallback(wg *sync.WaitGroup, channels int, samples <-chan [][]float32) portaudio.StreamCallback {
	wg.Add(1)
	return func(_ unsafe.Pointer, output unsafe.Pointer, sampleCount uint, _ *portaudio.StreamCallbackTimeInfo, _ portaudio.StreamCallbackFlags, _ unsafe.Pointer) int32 {

		const (
			statusContinue = int32(portaudio.PaContinue)
			statusComplete = int32(portaudio.PaComplete)
		)

		frame, ok := <-samples
		if !ok {
			wg.Done()
			return statusComplete
		}
		if len(frame) > int(sampleCount) {
			frame = frame[:sampleCount]
		}

		var idx int
		out := (*(*[1 << 32]float32)(unsafe.Pointer(output)))[:int(sampleCount)*channels]
		for _, sample := range frame {
			if len(sample) > channels {
				sample = sample[:channels]
			}
			for i := range sample {
				out[idx] = sample[i]
				idx++
			}
		}

		return statusContinue
	}
}

panic: sync: negative WaitGroup counter

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.