Skip to content

Commit

Permalink
Initial
Browse files Browse the repository at this point in the history
  • Loading branch information
aprice2704 committed Feb 26, 2018
0 parents commit ac949b7
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 0 deletions.
Binary file added catfish
Binary file not shown.
122 changes: 122 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package main

import (
"bytes"
"encoding/binary"
"fmt"
"math"

"github.com/yobert/alsa"
)

func main() {

cards, err := alsa.OpenCards()
if err != nil {
fmt.Println(err)
return
}
defer alsa.CloseCards(cards)

for _, card := range cards {
fmt.Println(card)

if err := beep_card(card); err != nil {
fmt.Println(err)
return
}
}
}

func beep_card(card *alsa.Card) error {
devices, err := card.Devices()
if err != nil {
return err
}
for _, device := range devices {
if device.Type != alsa.PCM || !device.Play {
continue
}
fmt.Println("───", device)

if err := beep_device(device); err != nil {
return err
}
}
return nil
}

func beep_device(device *alsa.Device) error {
var err error

if err = device.Open(); err != nil {
return err
}
defer device.Close()

channels, err := device.NegotiateChannels(1, 2)
if err != nil {
return err
}

rate, err := device.NegotiateRate(44100)
if err != nil {
return err
}

format, err := device.NegotiateFormat(alsa.S16_LE, alsa.S32_LE)
if err != nil {
return err
}

buffer_size, err := device.NegotiateBufferSize(1024, 8192, 16384)
if err != nil {
return err
}

if err = device.Prepare(); err != nil {
return err
}

buf := bytes.NewBuffer(nil)
t := 0.0

fmt.Printf("Negotiated parameters: %d channels, %d hz, %v, %d frame buffer\n",
channels, rate, format, buffer_size)

for {
buf.Reset()

for i := 0; i < buffer_size; i++ {
v := math.Sin(t * 2 * math.Pi * 200) // A4
v *= 0.01 // make a little quieter

switch format {
case alsa.S16_LE:
sample := int16(v * ((1 << 16) - 1))

for c := 0; c < channels; c++ {
binary.Write(buf, binary.LittleEndian, sample)
}

case alsa.S32_LE:
sample := int32(v * ((1 << 32) - 1))

for c := 0; c < channels; c++ {
binary.Write(buf, binary.LittleEndian, sample)
}

default:
return fmt.Errorf("Unhandled sample format: %v", format)
}

t += 1.0 / float64(rate)
}

if err := device.Write(buf.Bytes(), buffer_size); err != nil {
return err
}
}

return nil
}

0 comments on commit ac949b7

Please sign in to comment.