diff --git a/janus/src/audio.c b/janus/src/audio.c index 1ef61e1..4345d09 100644 --- a/janus/src/audio.c +++ b/janus/src/audio.c @@ -58,10 +58,10 @@ static void *_pcm_thread(void *v_audio); static void *_encoder_thread(void *v_audio); -audio_s *audio_init(const char *name) { +audio_s *audio_init(const char *name, unsigned pcm_hz) { audio_s *audio; A_CALLOC(audio, 1); - audio->pcm_hz = 48000; + audio->pcm_hz = pcm_hz; audio->pcm_queue = queue_init(8); audio->enc_queue = queue_init(8); atomic_init(&audio->working, true); diff --git a/janus/src/audio.h b/janus/src/audio.h index 79c34d2..3889e5f 100644 --- a/janus/src/audio.h +++ b/janus/src/audio.h @@ -65,7 +65,7 @@ typedef struct { } audio_s; -audio_s *audio_init(const char *name); +audio_s *audio_init(const char *name, unsigned pcm_hz); void audio_destroy(audio_s *audio); int audio_get_encoded(audio_s *audio, uint8_t *data, size_t *size, uint64_t *pts); diff --git a/janus/src/plugin.c b/janus/src/plugin.c index c52a662..08dbdb7 100644 --- a/janus/src/plugin.c +++ b/janus/src/plugin.c @@ -46,6 +46,7 @@ #include "jlogging.h" #include "audio.h" +#include "tc358743.h" #include "rtpv.h" #include "rtpa.h" @@ -122,6 +123,7 @@ const useconds_t _g_lock_polling = 1000; const useconds_t _g_watchers_polling = 100000; static char *_g_audio_dev = NULL; +static char *_g_tc358743_dev = NULL; static _client_s *_g_clients = NULL; static janus_callbacks *_g_gw = NULL; @@ -273,6 +275,7 @@ static void *_clients_audio_thread(UNUSED void *arg) { A_THREAD_RENAME("us_a_clients"); atomic_store(&_g_audio_tid_created, true); assert(_g_audio_dev); + assert(_g_tc358743_dev); while (!STOP) { if (!HAS_WATCHERS) { @@ -280,12 +283,26 @@ static void *_clients_audio_thread(UNUSED void *arg) { continue; } + tc358743_info_s info = {0}; audio_s *audio = NULL; - if ((audio = audio_init(_g_audio_dev)) == NULL) { + + if ( + tc358743_read_info(_g_tc358743_dev, &info) < 0 + || !info.has_audio + || (audio = audio_init(_g_audio_dev, info.audio_hz)) == NULL + ) { goto close_audio; } while (!STOP && HAS_WATCHERS) { + if ( + tc358743_read_info(_g_tc358743_dev, &info) < 0 + || !info.has_audio + || audio->pcm_hz != info.audio_hz + ) { + goto close_audio; + } + size_t size = RTP_DATAGRAM_SIZE - RTP_HEADER_SIZE; uint8_t data[size]; uint64_t pts; @@ -337,6 +354,10 @@ static int _read_config(const char *config_dir_path) { } if ((_g_audio_dev = _get_config_value(config, "audio", "device")) != NULL) { JLOG_INFO("main", "Enabled the experimental AUDIO feature"); + if ((_g_tc358743_dev = _get_config_value(config, "audio", "tc358743")) == NULL) { + JLOG_INFO("main", "Missing config value: audio.tc358743"); + goto error; + } } int retval = 0; @@ -396,6 +417,7 @@ static void _plugin_destroy(void) { DEL(rtpa_destroy, _g_rtpa); DEL(rtpv_destroy, _g_rtpv); _g_gw = NULL; + DEL(free, _g_tc358743_dev); DEL(free, _g_audio_dev); DEL(free, _g_memsink_obj); # undef DEL diff --git a/janus/src/tc358743.c b/janus/src/tc358743.c new file mode 100644 index 0000000..d30844d --- /dev/null +++ b/janus/src/tc358743.c @@ -0,0 +1,64 @@ +/***************************************************************************** +# # +# uStreamer - Lightweight and fast MJPEG-HTTP streamer. # +# # +# Copyright (C) 2018-2022 Maxim Devaev # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +*****************************************************************************/ + + +#include "tc358743.h" + + +#ifndef V4L2_CID_USER_TC358743_BASE +# define V4L2_CID_USER_TC358743_BASE (V4L2_CID_USER_BASE + 0x1080) +#endif +#ifndef TC358743_CID_AUDIO_PRESENT +# define TC358743_CID_AUDIO_PRESENT (V4L2_CID_USER_TC358743_BASE + 1) +#endif +#ifndef TC358743_CID_AUDIO_SAMPLING_RATE +# define TC358743_CID_AUDIO_SAMPLING_RATE (V4L2_CID_USER_TC358743_BASE + 0) +#endif + + +int tc358743_read_info(const char *path, tc358743_info_s *info) { + MEMSET_ZERO(*info); + + int fd = -1; + if ((fd = open(path, O_RDWR)) < 0) { + JLOG_PERROR("audio", "Can't open TC358743 V4L2 device"); + return -1; + } + +# define READ_CID(_cid, _field) { \ + struct v4l2_control ctl = {0}; \ + ctl.id = _cid; \ + if (xioctl(fd, VIDIOC_G_CTRL, &ctl) < 0) { \ + JLOG_PERROR("audio", "Can't get value of " #_cid); \ + close(fd); \ + return -1; \ + } \ + info->_field = ctl.value; \ + } + + READ_CID(TC358743_CID_AUDIO_PRESENT, has_audio); + READ_CID(TC358743_CID_AUDIO_SAMPLING_RATE, audio_hz); + +# undef READ_CID + + close(fd); + return 0; +} diff --git a/janus/src/tc358743.h b/janus/src/tc358743.h new file mode 100644 index 0000000..5b5d1dc --- /dev/null +++ b/janus/src/tc358743.h @@ -0,0 +1,46 @@ +/***************************************************************************** +# # +# uStreamer - Lightweight and fast MJPEG-HTTP streamer. # +# # +# Copyright (C) 2018-2022 Maxim Devaev # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +*****************************************************************************/ + + +#pragma once + +#include +#include +#include + +#include + +#include +#include + +#include "uslibs/tools.h" +#include "uslibs/xioctl.h" + +#include "jlogging.h" + + +typedef struct { + bool has_audio; + unsigned audio_hz; +} tc358743_info_s; + + +int tc358743_read_info(const char *path, tc358743_info_s *info); diff --git a/janus/src/uslibs/xioctl.h b/janus/src/uslibs/xioctl.h new file mode 120000 index 0000000..4a6a363 --- /dev/null +++ b/janus/src/uslibs/xioctl.h @@ -0,0 +1 @@ +../../../src/libs/xioctl.h \ No newline at end of file