92 lines
2.6 KiB
Odin
92 lines
2.6 KiB
Odin
package main
|
|||
|
|
|
||
|
|
import "core:strings"
|
||
|
|
import "core:thread"
|
||
|
|
import "core:fmt"
|
||
|
|
import "core:net"
|
||
|
|
import "core:os/os2"
|
||
|
|
|
||
|
|
import "shared:alsa"
|
||
|
|
|
||
|
|
DEVICE :: "default"
|
||
|
|
FRAMES :: 128
|
||
|
|
FORMAT: alsa.pcm_format_t : .S16_LE
|
||
|
|
BITS_PER_SAMPLE :: 16
|
||
|
|
CHANNELS :: 1
|
||
|
|
SAMPLE_RATE :: 22050
|
||
|
|
UDP_DATAGRAM_MAX_LEN :: 65535
|
||
|
|
|
||
|
|
main :: proc() {
|
||
|
|
handle: ^alsa.pcm_t
|
||
|
|
|
||
|
|
alsa_err := alsa.pcm_open(&handle, DEVICE, .CAPTURE, .BLOCK)
|
||
|
|
if alsa_err < 0 {
|
||
|
|
fmt.eprintln("Failed to open default capture device:", alsa_err)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
defer alsa.pcm_close(handle)
|
||
|
|
|
||
|
|
alsa_err = alsa.pcm_set_params(handle, FORMAT, .RW_INTERLEAVED, CHANNELS, SAMPLE_RATE, 1, 500000)
|
||
|
|
if alsa_err < 0 {
|
||
|
|
fmt.eprintln("Failed to set the HW params:", alsa_err)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
|
||
|
|
alsa_err = alsa.pcm_prepare(handle)
|
||
|
|
if alsa_err < 0 {
|
||
|
|
fmt.eprintln("Failed to prepare audio device for capture:", alsa_err)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
|
||
|
|
sock, err := net.make_bound_udp_socket(net.IP4_Address{0, 0, 0, 0}, 50550)
|
||
|
|
//sock, err := net.create_socket(.IP4, .UDP)
|
||
|
|
if err != nil {
|
||
|
|
fmt.eprintln("Failed to create a UDP socket:", err)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
fmt.println("Listening on 0.0.0.0:50550")
|
||
|
|
|
||
|
|
samples := make([]u8, FRAMES * CHANNELS * alsa.pcm_format_width(FORMAT) / 8)
|
||
|
|
|
||
|
|
thread.run_with_data(&sock, proc(sock: rawptr) {
|
||
|
|
sock := transmute(^net.UDP_Socket)sock
|
||
|
|
recv_buf := make([]u8, UDP_DATAGRAM_MAX_LEN)
|
||
|
|
|
||
|
|
for {
|
||
|
|
read_bytes, recv_endpoint, err := net.recv_udp(sock^, recv_buf)
|
||
|
|
if err != nil {
|
||
|
|
if err == .Excess_Truncated {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
fmt.eprintln("Failed to receive data from UDP socket:", err)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
if read_bytes > 0 {
|
||
|
|
fmt.printf("Got this message from \"%v:%v\": ", recv_endpoint.address, recv_endpoint.port)
|
||
|
|
fmt.printfln("\"%v\"", strings.trim_space(string(recv_buf)))
|
||
|
|
//fmt.println(read_bytes)
|
||
|
|
//fmt.println(recv_endpoint)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
for {
|
||
|
|
read := alsa.pcm_readi(handle, raw_data(samples), FRAMES)
|
||
|
|
if read != FRAMES {
|
||
|
|
fmt.eprintfln("Expected to read %v frame, got %v frames instead", FRAMES, read)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
|
||
|
|
endpoint := net.Endpoint{
|
||
|
|
address = net.IP4_Address{10, 0, 0, 5},
|
||
|
|
port = 1234,
|
||
|
|
}
|
||
|
|
|
||
|
|
_, err := net.send_udp(sock, samples, endpoint)
|
||
|
|
if err != nil {
|
||
|
|
fmt.eprintln("Failed to send data to UDP socket:", err)
|
||
|
|
os2.exit(1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|