Skip to content
HardCastleXPublic

About

SHOUTcast v2 GUI con protocolo nativo Ultravox 2.1 con selección de Stream ID

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

GoCast

Transmisor de audio nativo para SHOUTcast v2 con interfaz gráfica en Windows, reescrito 100% en Golang.

Captura el audio del sistema (loopback WASAPI) o un micrófono, lo codifica a MP3 en tiempo real y lo envía a un servidor SHOUTcast DNAS v2 usando el protocolo nativo SHOUTcast 2 (Ultravox 2.1).

Compila en un único binario ejecutable (GoCast.exe), sin requerir Python, DLLs externas ni herramientas CGO/GCC instaladas.

¿Por qué el protocolo nativo?

Los encoders clásicos que usan el protocolo SHOUTcast v1 (contraseña por el puerto +1) no pueden elegir el Stream ID en un DNAS 2.x: el audio termina montado en un stream nuevo (sid 1) y tu enlace de escucha queda "offline" aunque el encoder diga que está transmitiendo. GoCast implementa el handshake Ultravox 2.1 completo (autenticación cifrada con XTEA, negociación de stream y envío de datos encapsulado), por lo que el audio llega al Stream ID correcto en servidores multi-stream.

Características

  • 100% Go nativo (sin CGO): compilación directa en Windows sin necesidad de MinGW ni GCC.
  • Protocolo SHOUTcast 2 nativo (Ultravox 2.1) con selección de Stream ID y cifrado XTEA.
  • Captura WASAPI en tiempo real: loopback del sistema (altavoces/auriculares) o micrófonos/entradas con detección del dispositivo predeterminado.
  • Inyección automática de silencio: mantiene la conexión viva incluso cuando no hay música reproduciéndose.
  • Codificador MP3 en Go puro: bitrates seleccionables a 128 / 192 / 256 / 320 kbps con remuestreo automático a 48000 Hz / 44100 Hz.
  • VU meter estéreo en tiempo real (canales L y R).
  • Gestión de presets: guarda, carga y elimina configuraciones de servidores en presets.json.
  • Estadísticas al aire: cronómetro en vivo y contador de megabytes transmitidos.
  • Manejo de errores claro: detección de "Stream ocupado (AutoDJ)", credenciales incorrectas, SID inválido, etc.
  • Interfaz multiidioma: inglés (por defecto) y español, con selector de idioma al iniciar y preferencia guardada en config.json.

Requisitos

  • Windows 10 u 11 (x64)
  • Go 1.20 o superior (solo necesario si compilas desde el código fuente)

Compilación y Ejecución

Ejecutar directamente:

go run .

Compilar el binario ejecutable (.exe):

go build -o GoCast.exe .

O para compilar como aplicación GUI sin ventana de terminal de fondo:

go build -ldflags "-H windowsgui" -o GoCast.exe .

Importante (manifiesto): la GUI usa la librería Walk, que requiere Common Controls 6. El manifiesto GoCast.manifest ya está embebido en rsrc.syso, por lo que el build funciona directamente. Si modificas el manifiesto, regenera el recurso antes de compilar:

go run github.com/akavel/rsrc@v0.10.2 -manifest GoCast.manifest -o rsrc.syso

Sin el manifiesto, la ventana no se crea y el programa se cierra al instante (TTM_ADDTOOL failed).

Rendimiento

La captura de audio es event-driven (WASAPI EventCallback + WaitForSingleObject), no polling, y los buffers PCM se reutilizan con un sync.Pool para no generar basura en el camino de tiempo real.

Perfilado (opcional)

El binario normal no incluye pprof. Para perfilar, compila con el tag pprof:

go build -tags pprof -ldflags "-H windowsgui" -o GoCast.exe .
$env:GOCAST_PPROF_ADDR = ":6060"        # sirve net/http/pprof
$env:GOCAST_CPU_PROFILE = "cpu.pprof"   # escribe un perfil de CPU al salir
.\GoCast.exe

Luego: go tool pprof http://localhost:6060/debug/pprof/profile o go tool pprof GoCast.exe cpu.pprof.

Optimización guiada por perfil (PGO)

El repo incluye default.pgo, generado con el benchmark del codificador. Go lo aplica automáticamente al compilar el paquete raíz (también en CI). Para regenerarlo tras tocar el codificador:

go test -run "^$" -bench BenchmarkStreamEncoder -benchtime 2s -cpuprofile default.pgo ./pkg/mp3

Uso

  1. Elige el Dispositivo de Audio en el menú desplegable.
  2. Ingresa Hostname or IP, Port, Stream ID (SID), DJ Username y Password.
  3. Selecciona el Bitrate deseado (ej. 256 kbps).
  4. Pulsa Iniciar Broadcast.

Dispositivos: [Loopback] vs Entradas Directas

  • Con [Loopback]: Copia digital directa de lo que suena por esa salida (altavoces o audífonos). Es la opción estándar para transmitir música o el audio completo de tu PC.
  • Sin [Loopback]: Dispositivos de entrada físicos o virtuales (micrófonos, entradas de línea, cables virtuales VB-Audio).

Idiomas

La interfaz está disponible en inglés (idioma por defecto) y español. Al iniciar la aplicación se abre una ventana independiente de selección de idioma, cuyo texto se muestra en el idioma del sistema (español si tu Windows está en español, inglés en cualquier otro caso). Lo que elijas define el idioma de toda la app y se guarda en config.json, así que se recuerda en las siguientes ejecuciones; si cierras esa ventana (X / Alt+F4), la aplicación no arranca.

Las traducciones viven en pkg/i18n/ (en.json, es.json) y se embeben dentro del .exe con //go:embed, por lo que el binario sigue siendo autónomo. El inglés es el idioma base: cualquier clave que falte en español cae automáticamente al inglés.

Estructura del Proyecto en Go

  • main.go / cmd/pycast/main.go — Puntos de entrada (wrappers de app.Run())
  • pkg/app/ — Interfaz gráfica Win32 nativa (Walk), estado de conexión, cambio de idioma y bucle de streaming
  • pkg/i18n/ — Motor de traducciones (inglés/español) embebidas en el binario
  • pkg/config/ — Preferencias del usuario persistidas en config.json (p. ej. el idioma)
  • pkg/uvox/ — Implementación completa del protocolo Ultravox 2.1 (framing, cifrado XTEA, handshake y envío MP3)
  • pkg/mp3/ — Codificador MP3 en Go puro para streaming en tiempo real (capas MDCT, subband, Huffman, reservoir)
  • pkg/audio/ — Captura de audio WASAPI (loopback y micrófonos), remuestreo y cálculo de picos VU
  • pkg/presets/ — Gestor persistente de servidores en presets.json
  • cmd/test_encode/ — Herramienta de prueba de captura y codificación MP3
  • cmd/test_sc/ — Herramienta de prueba de dispositivos de sonido

Licencia

GPL-3.0 — ver LICENSE.

About

SHOUTcast v2 GUI con protocolo nativo Ultravox 2.1 con selección de Stream ID

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages