Continue prototyping
This commit is contained in:
parent
d6f9ac7138
commit
86d6751754
53
audio/audio.go
Normal file
53
audio/audio.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package audio
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os/exec"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type MicStreamConfig struct {
|
||||||
|
Format string
|
||||||
|
Device string
|
||||||
|
Encoding string
|
||||||
|
Bitrate int
|
||||||
|
Channels int
|
||||||
|
}
|
||||||
|
|
||||||
|
func StreamMic(config MicStreamConfig) *exec.Cmd {
|
||||||
|
cmd := exec.Command("ffmpeg", "-re",
|
||||||
|
"-f", config.Format,
|
||||||
|
"-i", config.Device,
|
||||||
|
"-f", config.Encoding,
|
||||||
|
"-ar", fmt.Sprintf("%d", config.Bitrate),
|
||||||
|
"-ac", fmt.Sprintf("%d", config.Channels),
|
||||||
|
"-",
|
||||||
|
)
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMicDevice() (string, error) {
|
||||||
|
cmd := exec.Command("ffmpeg",
|
||||||
|
"-f", "avfoundation",
|
||||||
|
"-list_devices", "true",
|
||||||
|
"-i", "\"\"",
|
||||||
|
)
|
||||||
|
// ignore error, this ffmpeg command returns exit status 1
|
||||||
|
outputBytes, _ := cmd.CombinedOutput()
|
||||||
|
output := string(outputBytes)
|
||||||
|
parsedOutput := parseDeviceNumber(output)
|
||||||
|
if parsedOutput == "" {
|
||||||
|
return "", fmt.Errorf("Command: %s\nFailed to parse FFmpeg output:\n%s", cmd, output)
|
||||||
|
}
|
||||||
|
return parsedOutput, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseDeviceNumber(ffmpegOutput string) string {
|
||||||
|
re := regexp.MustCompile(`\[(\d)\].*?[Mm]icrophone`)
|
||||||
|
matches := re.FindStringSubmatch(ffmpegOutput)
|
||||||
|
if (len(matches) == 2) {
|
||||||
|
return matches[1]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
37
main.go
37
main.go
@ -2,13 +2,16 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"io"
|
||||||
"time"
|
"time"
|
||||||
"remote-mic/socketops"
|
"remote-mic/socketops"
|
||||||
"remote-mic/pulsectl"
|
"remote-mic/pulsectl"
|
||||||
|
"remote-mic/audio"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func nop() {
|
func socketExample() {
|
||||||
fmt.Print("Listening for TCP connection on port 8080... ")
|
fmt.Print("Listening for TCP connection on port 8080... ")
|
||||||
conn, err := socketops.AcceptConn(":8080")
|
conn, err := socketops.AcceptConn(":8080")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -24,7 +27,7 @@ func nop() {
|
|||||||
fmt.Println("Exiting.")
|
fmt.Println("Exiting.")
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func pulsectlExample() {
|
||||||
pulsectl.LoadPipeSource(pulsectl.PipeSourceConfig{
|
pulsectl.LoadPipeSource(pulsectl.PipeSourceConfig{
|
||||||
"remote-mic",
|
"remote-mic",
|
||||||
"/dev/shm",
|
"/dev/shm",
|
||||||
@ -35,3 +38,33 @@ func main() {
|
|||||||
time.Sleep(10 * time.Second)
|
time.Sleep(10 * time.Second)
|
||||||
pulsectl.UnloadPipeSource()
|
pulsectl.UnloadPipeSource()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func micStreamExample() {
|
||||||
|
cmd := audio.StreamMic(audio.MicStreamConfig{
|
||||||
|
"avfoundation",
|
||||||
|
":0",
|
||||||
|
"s16le",
|
||||||
|
44100,
|
||||||
|
2,
|
||||||
|
})
|
||||||
|
|
||||||
|
pipe, _ := cmd.StdoutPipe()
|
||||||
|
|
||||||
|
cmd.Start()
|
||||||
|
|
||||||
|
for {
|
||||||
|
io.Copy(os.Stdout, pipe)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDeviceExample() {
|
||||||
|
device, err := audio.GetMicDevice()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println(device)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
getDeviceExample()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user