mirror of https://github.com/wb2osz/direwolf.git
Add stdout option for audio output
This commit is contained in:
parent
58652df5b9
commit
f1fcb8cd95
47
src/audio.c
47
src/audio.c
|
@ -129,6 +129,7 @@ static struct adev_s {
|
|||
int outbuf_len;
|
||||
|
||||
enum audio_in_type_e g_audio_in_type;
|
||||
enum audio_out_type_e g_audio_out_type;
|
||||
|
||||
int udp_sock; /* UDP socket for receiving data */
|
||||
|
||||
|
@ -453,9 +454,20 @@ int audio_open (struct audio_s *pa)
|
|||
}
|
||||
|
||||
/*
|
||||
* Output device. Only "soundcard" is supported at this time.
|
||||
* Output device. Only "soundcard" and "stdout" are supported at this time.
|
||||
*/
|
||||
if (strcasecmp(pa->adev[a].adevice_out, "stdout") == 0 || strcmp(pa->adev[a].adevice_out, "-") == 0) {
|
||||
adev[a].g_audio_out_type = AUDIO_OUT_TYPE_STDOUT;
|
||||
} else {
|
||||
adev[a].g_audio_out_type = AUDIO_OUT_TYPE_SOUNDCARD;
|
||||
}
|
||||
|
||||
switch (adev[a].g_audio_out_type) {
|
||||
case AUDIO_OUT_TYPE_STDOUT:
|
||||
adev[a].outbuf_size_in_bytes = 1024;
|
||||
break;
|
||||
|
||||
case AUDIO_OUT_TYPE_SOUNDCARD:
|
||||
#if USE_ALSA
|
||||
err = snd_pcm_open (&(adev[a].audio_out_handle), audio_out_name, SND_PCM_STREAM_PLAYBACK, 0);
|
||||
|
||||
|
@ -498,7 +510,7 @@ int audio_open (struct audio_s *pa)
|
|||
return (-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
/*
|
||||
* Finally allocate buffer for each direction.
|
||||
*/
|
||||
|
@ -1333,6 +1345,29 @@ int audio_put (int a, int c)
|
|||
|
||||
int audio_flush (int a)
|
||||
{
|
||||
switch (adev[a].g_audio_out_type) {
|
||||
case AUDIO_OUT_TYPE_STDOUT:;
|
||||
int res;
|
||||
unsigned char *ptr;
|
||||
int len;
|
||||
|
||||
ptr = adev[a].outbuf_ptr;
|
||||
len = adev[a].outbuf_len;
|
||||
|
||||
while (len > 0) {
|
||||
res = write(STDOUT_FILENO, ptr, (size_t) len);
|
||||
if (res <= 0) {
|
||||
text_color_set(DW_COLOR_INFO);
|
||||
dw_printf ("\nError writing to stdout. Exiting.\n");
|
||||
exit (0);
|
||||
}
|
||||
ptr += res;
|
||||
len -= res;
|
||||
}
|
||||
adev[a].outbuf_len = 0;
|
||||
return 0;
|
||||
|
||||
case AUDIO_OUT_TYPE_SOUNDCARD:;
|
||||
#if USE_ALSA
|
||||
int k;
|
||||
unsigned char *psound;
|
||||
|
@ -1504,7 +1539,8 @@ int audio_flush (int a)
|
|||
adev[a].outbuf_len = 0;
|
||||
return (0);
|
||||
#endif
|
||||
|
||||
}
|
||||
return (0);
|
||||
} /* end audio_flush */
|
||||
|
||||
|
||||
|
@ -1546,9 +1582,12 @@ int audio_flush (int a)
|
|||
|
||||
void audio_wait (int a)
|
||||
{
|
||||
|
||||
audio_flush (a);
|
||||
|
||||
if (adev[a].g_audio_out_type == AUDIO_OUT_TYPE_STDOUT) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if USE_ALSA
|
||||
|
||||
/* For playback, this should wait for all pending frames */
|
||||
|
|
|
@ -43,6 +43,10 @@ enum audio_in_type_e {
|
|||
AUDIO_IN_TYPE_SDR_UDP,
|
||||
AUDIO_IN_TYPE_STDIN };
|
||||
|
||||
enum audio_out_type_e {
|
||||
AUDIO_OUT_TYPE_SOUNDCARD,
|
||||
AUDIO_OUT_TYPE_STDOUT };
|
||||
|
||||
/* For option to try fixing frames with bad CRC. */
|
||||
|
||||
typedef enum retry_e {
|
||||
|
|
Loading…
Reference in New Issue