mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Renamed uvMeter to VU Meter (Volume Unit)
- Fixed issues flagged by code scanning bot.
This commit is contained in:
parent
bd0a0df900
commit
7edfe54ed7
@ -534,7 +534,7 @@
|
||||
"edt_conf_audio_device_title": "Audio Device",
|
||||
"edt_conf_audio_effects_expl": "Select an effect on how the audio signal is transformed to",
|
||||
"edt_conf_audio_effects_title": "Audio Effects",
|
||||
"edt_conf_audio_effect_enum_uvmeter": "UV-Meter",
|
||||
"edt_conf_audio_effect_enum_vumeter": "VU-Meter",
|
||||
"edt_conf_audio_effect_hotcolor_expl": "Hot Color",
|
||||
"edt_conf_audio_effect_hotcolor_title": "Hot Color",
|
||||
"edt_conf_audio_effect_multiplier_expl": "Audio Signal Value multiplier",
|
||||
|
@ -93,8 +93,8 @@
|
||||
"grabberAudio": {
|
||||
"enable": false,
|
||||
"device": "auto",
|
||||
"audioEffect": "uvMeter",
|
||||
"uvMeter": {
|
||||
"audioEffect": "vuMeter",
|
||||
"vuMeter": {
|
||||
"flip": "NO_CHANGE",
|
||||
"hotColor": [ 255, 0, 0 ],
|
||||
"multiplier": 1,
|
||||
|
@ -8,38 +8,83 @@
|
||||
// Hyperion-utils includes
|
||||
#include <grabber/AudioGrabber.h>
|
||||
|
||||
///
|
||||
/// @brief The Linux Audio capture implementation
|
||||
///
|
||||
class AudioGrabberLinux : public AudioGrabber
|
||||
{
|
||||
|
||||
// FIXME: Update and add descriptions for functions and class
|
||||
public:
|
||||
|
||||
AudioGrabberLinux();
|
||||
|
||||
///
|
||||
/// Process audio buffer
|
||||
///
|
||||
void processAudioBuffer(snd_pcm_sframes_t frames);
|
||||
|
||||
///
|
||||
/// Is Running Flag
|
||||
///
|
||||
std::atomic<bool> _isRunning;
|
||||
|
||||
///
|
||||
/// Current capture device
|
||||
///
|
||||
snd_pcm_t * _captureDevice;
|
||||
|
||||
public slots:
|
||||
|
||||
///
|
||||
/// Start audio capturing session
|
||||
///
|
||||
/// @returns true if successful
|
||||
bool start() override;
|
||||
|
||||
///
|
||||
/// Stop audio capturing session
|
||||
///
|
||||
void stop() override;
|
||||
|
||||
///
|
||||
/// Discovery audio devices
|
||||
///
|
||||
QJsonArray discover(const QJsonObject& params) override;
|
||||
|
||||
private:
|
||||
|
||||
///
|
||||
/// Refresh audio devices
|
||||
///
|
||||
void refreshDevices();
|
||||
|
||||
///
|
||||
/// Configure current audio capture interface
|
||||
///
|
||||
bool configureCaptureInterface();
|
||||
|
||||
///
|
||||
/// Get device name from path
|
||||
///
|
||||
QString getDeviceName(const QString& devicePath) const;
|
||||
|
||||
///
|
||||
/// Current sample rate
|
||||
///
|
||||
unsigned int _sampleRate;
|
||||
|
||||
///
|
||||
/// Audio capture thread
|
||||
///
|
||||
pthread_t _audioThread;
|
||||
|
||||
///
|
||||
/// ALSA device configuration parameters
|
||||
///
|
||||
snd_pcm_hw_params_t * _captureDeviceConfig;
|
||||
};
|
||||
|
||||
///
|
||||
/// Audio processing thread function
|
||||
///
|
||||
static void* AudioThreadRunner(void* params);
|
||||
|
||||
#endif // AUDIOGRABBERLINUX_H
|
||||
|
@ -10,11 +10,13 @@
|
||||
#include <grabber/AudioGrabberLinux.h>
|
||||
#endif
|
||||
|
||||
///
|
||||
/// Audio Grabber wrapper
|
||||
///
|
||||
class AudioWrapper : public GrabberWrapper
|
||||
{
|
||||
public:
|
||||
|
||||
// FIXME: Update and add descriptions for functions and class
|
||||
// The AudioWrapper has no params...
|
||||
|
||||
///
|
||||
@ -30,6 +32,9 @@ class AudioWrapper : public GrabberWrapper
|
||||
///
|
||||
~AudioWrapper() override;
|
||||
|
||||
///
|
||||
/// Settings update handler
|
||||
///
|
||||
void handleSettingsUpdate(settings::type type, const QJsonDocument& config) override;
|
||||
|
||||
public slots:
|
||||
@ -37,7 +42,16 @@ class AudioWrapper : public GrabberWrapper
|
||||
/// Performs a single frame grab and computes the led-colors
|
||||
///
|
||||
void action() override;
|
||||
|
||||
///
|
||||
/// Start audio capturing session
|
||||
///
|
||||
/// @returns true if successful
|
||||
bool start() override;
|
||||
|
||||
///
|
||||
/// Stop audio capturing session
|
||||
///
|
||||
void stop() override;
|
||||
|
||||
private:
|
||||
|
@ -89,9 +89,7 @@ void AudioGrabber::processAudioFrame(int16_t* buffer, int length)
|
||||
|
||||
// TODO: Support Stereo capture with different meters per side
|
||||
|
||||
// Default UVMeter - Later Make this pluggable for different audio effects
|
||||
// FIXME: We might already reflect different ways of audio image representation in the grabber JSON. I will provide a sample how it might look like...
|
||||
|
||||
// Default VUMeter - Later Make this pluggable for different audio effects
|
||||
|
||||
double averageAmplitude = 0;
|
||||
// Calculate the the average amplitude value in the buffer
|
||||
|
@ -205,14 +205,7 @@ bool AudioGrabberLinux::start()
|
||||
stop();
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
if (pthread_attr_setschedparam(&threadAttributes, &schedulerParameter) != 0)
|
||||
{
|
||||
Debug(_log, "Failed to set scheduler parameters");
|
||||
stopAudio();
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
if (pthread_create(&_audioThread, &threadAttributes, static_cast<THREADFUNCPTR>(&AudioThreadRunner), static_cast<void*>(this)) != 0)
|
||||
{
|
||||
Debug(_log, "Failed to create audio capture thread");
|
||||
@ -250,7 +243,7 @@ void AudioGrabberLinux::processAudioBuffer(snd_pcm_sframes_t frames)
|
||||
|
||||
ssize_t bytes = snd_pcm_frames_to_bytes(_captureDevice, frames);
|
||||
|
||||
int16_t * buffer = static_cast<int16_t*>(calloc(static_cast<size_t>(bytes / 2), sizeof(int16_t))); // * snd_pcm_format_width(SND_PCM_FORMAT_S16_LE) / 8 * 2);
|
||||
int16_t * buffer = static_cast<int16_t*>(calloc(static_cast<size_t>(bytes / 2), sizeof(int16_t)));
|
||||
|
||||
if (frames == 0)
|
||||
{
|
||||
|
@ -2,162 +2,162 @@
|
||||
"type": "object",
|
||||
"required": true,
|
||||
"title": "edt_conf_audio_heading_title",
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"title": "edt_conf_general_enable_title",
|
||||
"required": true,
|
||||
"default": false,
|
||||
"propertyOrder": 1
|
||||
},
|
||||
"available_devices": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_grabber_discovered_title",
|
||||
"default": "edt_conf_grabber_discovery_inprogress",
|
||||
"options": {
|
||||
"infoText": "edt_conf_grabber_discovered_title_info"
|
||||
},
|
||||
"propertyOrder": 2,
|
||||
"required": false
|
||||
},
|
||||
"device": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"default": "auto",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"propertyOrder": 3,
|
||||
"comment": "The 'available_audio_devices' settings are dynamically inserted into the WebUI under PropertyOrder '1'."
|
||||
},
|
||||
"audioEffect": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_audio_effects_title",
|
||||
"required": true,
|
||||
"enum": [ "uvMeter" ],
|
||||
"default": "uvMeter",
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_audio_effect_enum_uvmeter"]
|
||||
},
|
||||
"propertyOrder": 4
|
||||
},
|
||||
"uvMeter": {
|
||||
"type": "object",
|
||||
"title": "",
|
||||
"required": true,
|
||||
"propertyOrder": 5,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"audioEffect": "uvMeter"
|
||||
"properties": {
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"title": "edt_conf_general_enable_title",
|
||||
"required": true,
|
||||
"default": false,
|
||||
"propertyOrder": 1
|
||||
},
|
||||
"available_devices": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_grabber_discovered_title",
|
||||
"default": "edt_conf_grabber_discovery_inprogress",
|
||||
"options": {
|
||||
"infoText": "edt_conf_grabber_discovered_title_info"
|
||||
},
|
||||
"propertyOrder": 2,
|
||||
"required": false
|
||||
},
|
||||
"device": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"default": "auto",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"propertyOrder": 3,
|
||||
"comment": "The 'available_audio_devices' settings are dynamically inserted into the WebUI under PropertyOrder '1'."
|
||||
},
|
||||
"audioEffect": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_audio_effects_title",
|
||||
"required": true,
|
||||
"enum": [ "vuMeter" ],
|
||||
"default": "vuMeter",
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_audio_effect_enum_vumeter" ]
|
||||
},
|
||||
"propertyOrder": 4
|
||||
},
|
||||
"vuMeter": {
|
||||
"type": "object",
|
||||
"title": "",
|
||||
"required": true,
|
||||
"propertyOrder": 5,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"audioEffect": "vuMeter"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"multiplier": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_multiplier_title",
|
||||
"default": 1,
|
||||
"minimum": 0,
|
||||
"step": 0.01,
|
||||
"required": true,
|
||||
"propertyOrder": 1,
|
||||
"comment": "The multiplier is used to scale the audio input signal. Increase or decrease to achieve the desired effect. Set to 0 for auto"
|
||||
},
|
||||
"tolerance": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_tolerance_title",
|
||||
"default": 5,
|
||||
"minimum": 0,
|
||||
"step": 1,
|
||||
"append": "edt_append_percent",
|
||||
"required": true,
|
||||
"propertyOrder": 2,
|
||||
"comment": "The tolerance is a percentage value from 0 - 100 used during auto multiplier calculation."
|
||||
},
|
||||
"hotColor": {
|
||||
"type": "array",
|
||||
"title": "edt_conf_audio_effect_hotcolor_title",
|
||||
"default": [ 255, 0, 0 ],
|
||||
"format": "colorpicker",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"required": true,
|
||||
"propertyOrder": 3,
|
||||
"comment": "Hot Color is the color the led's will reach when audio level exceeds the warn percentage"
|
||||
},
|
||||
"warnColor": {
|
||||
"type": "array",
|
||||
"title": "edt_conf_audio_effect_warncolor_title",
|
||||
"default": [ 255, 255, 0 ],
|
||||
"format": "colorpicker",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"required": true,
|
||||
"propertyOrder": 4,
|
||||
"comment": "Warn Color is the color the led's will reach when audio level exceeds the safe percentage"
|
||||
},
|
||||
"warnValue": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_warnvalue_title",
|
||||
"default": 80,
|
||||
"minimum": 0,
|
||||
"step": 1,
|
||||
"append": "edt_append_percent",
|
||||
"required": true,
|
||||
"propertyOrder": 5,
|
||||
"comment": "Warn percentage is the percentage used to determine the maximum percentage of the audio warning level"
|
||||
},
|
||||
"safeColor": {
|
||||
"type": "array",
|
||||
"title": "edt_conf_audio_effect_safecolor_title",
|
||||
"default": [ 0, 255, 0 ],
|
||||
"format": "colorpicker",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"required": true,
|
||||
"propertyOrder": 6,
|
||||
"comment": "Safe Color is the color the led's will reach when audio level is below the warning percentage"
|
||||
},
|
||||
"safeValue": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_safevalue_title",
|
||||
"default": 45,
|
||||
"minimum": 0,
|
||||
"step": 1,
|
||||
"append": "edt_append_percent",
|
||||
"required": true,
|
||||
"propertyOrder": 7,
|
||||
"comment": "Safe percentage is the percentage used to determine the maximum percentage of the audio safe level"
|
||||
},
|
||||
"flip": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_flip_title",
|
||||
"enum": [ "NO_CHANGE", "HORIZONTAL", "VERTICAL", "BOTH" ],
|
||||
"default": "NO_CHANGE",
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_NO_CHANGE", "edt_conf_enum_HORIZONTAL", "edt_conf_enum_VERTICAL", "edt_conf_enum_BOTH" ]
|
||||
},
|
||||
"required": true,
|
||||
"access": "advanced",
|
||||
"propertyOrder": 8
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"multiplier": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_multiplier_title",
|
||||
"default": 1,
|
||||
"minimum": 0,
|
||||
"step": 0.01,
|
||||
"required": true,
|
||||
"propertyOrder": 1,
|
||||
"comment": "The multiplier is used to scale the audio input signal. Increase or decrease to achieve the desired effect. Set to 0 for auto"
|
||||
},
|
||||
"tolerance": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_tolerance_title",
|
||||
"default": 5,
|
||||
"minimum": 0,
|
||||
"step": 1,
|
||||
"append": "edt_append_percent",
|
||||
"required": true,
|
||||
"propertyOrder": 2,
|
||||
"comment": "The tolerance is a percentage value from 0 - 100 used during auto multiplier calculation."
|
||||
},
|
||||
"hotColor": {
|
||||
"type": "array",
|
||||
"title": "edt_conf_audio_effect_hotcolor_title",
|
||||
"default": [ 255, 0, 0 ],
|
||||
"format": "colorpicker",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"required": true,
|
||||
"propertyOrder": 3,
|
||||
"comment": "Hot Color is the color the led's will reach when audio level exceeds the warn percentage"
|
||||
},
|
||||
"warnColor": {
|
||||
"type": "array",
|
||||
"title": "edt_conf_audio_effect_warncolor_title",
|
||||
"default": [ 255, 255, 0 ],
|
||||
"format": "colorpicker",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"required": true,
|
||||
"propertyOrder": 4,
|
||||
"comment": "Warn Color is the color the led's will reach when audio level exceeds the safe percentage"
|
||||
},
|
||||
"warnValue": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_warnvalue_title",
|
||||
"default": 80,
|
||||
"minimum": 0,
|
||||
"step": 1,
|
||||
"append": "edt_append_percent",
|
||||
"required": true,
|
||||
"propertyOrder": 5,
|
||||
"comment": "Warn percentage is the percentage used to determine the maximum percentage of the audio warning level"
|
||||
},
|
||||
"safeColor": {
|
||||
"type": "array",
|
||||
"title": "edt_conf_audio_effect_safecolor_title",
|
||||
"default": [ 0, 255, 0 ],
|
||||
"format": "colorpicker",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"required": true,
|
||||
"propertyOrder": 6,
|
||||
"comment": "Safe Color is the color the led's will reach when audio level is below the warning percentage"
|
||||
},
|
||||
"safeValue": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_audio_effect_safevalue_title",
|
||||
"default": 45,
|
||||
"minimum": 0,
|
||||
"step": 1,
|
||||
"append": "edt_append_percent",
|
||||
"required": true,
|
||||
"propertyOrder": 7,
|
||||
"comment": "Safe percentage is the percentage used to determine the maximum percentage of the audio safe level"
|
||||
},
|
||||
"flip": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_flip_title",
|
||||
"enum": [ "NO_CHANGE", "HORIZONTAL", "VERTICAL", "BOTH" ],
|
||||
"default": "NO_CHANGE",
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_NO_CHANGE", "edt_conf_enum_HORIZONTAL", "edt_conf_enum_VERTICAL", "edt_conf_enum_BOTH" ]
|
||||
},
|
||||
"required": true,
|
||||
"access": "advanced",
|
||||
"propertyOrder": 8
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
|
@ -734,13 +734,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
|
||||
_audioGrabber = new AudioWrapper();
|
||||
_audioGrabber->handleSettingsUpdate(settings::AUDIO, getSetting(settings::AUDIO));
|
||||
|
||||
//connect(this, &HyperionDaemon::setVideoMode, _audioGrabber, &AudioWrapper::setVideoMode); // Do we need this?
|
||||
connect(this, &HyperionDaemon::settingsChanged, _audioGrabber, &AudioWrapper::handleSettingsUpdate);
|
||||
|
||||
Debug(_log, "Audio grabber created");
|
||||
}
|
||||
|
||||
//_audioGrabber->tryStart();
|
||||
#else
|
||||
Debug(_log, "Audio capture not supported on this platform");
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user