mirror of
				https://github.com/AlexandreRouma/SDRPlusPlus.git
				synced 2025-10-31 00:48:11 +01:00 
			
		
		
		
	
							
								
								
									
										57
									
								
								core/src/imgui/imgui_custom.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								core/src/imgui/imgui_custom.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| #include "imgui_custom.h" | ||||
| #include "imgui.h" | ||||
|  | ||||
| #ifndef IMGUI_DEFINE_MATH_OPERATORS | ||||
| #define IMGUI_DEFINE_MATH_OPERATORS | ||||
| #endif | ||||
| #include "imgui_internal.h" | ||||
|  | ||||
| namespace ImGui{ | ||||
|      void VolumeBar(float volumeL, float volumeR, float *holdL, float *holdR, const ImVec2& size_arg){ | ||||
|         ImGuiWindow* window = GetCurrentWindow(); | ||||
|         if (window->SkipItems) | ||||
|             return; | ||||
|  | ||||
|         ImGuiContext& g = *GImGui; | ||||
|         const ImGuiStyle& style = g.Style; | ||||
|  | ||||
|         ImVec2 pos = window->DC.CursorPos; | ||||
|         ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y * 2.0f); | ||||
|         ImRect bb(pos, pos + size); | ||||
|         ItemSize(size, style.FramePadding.y); | ||||
|         if (!ItemAdd(bb, 0)) | ||||
|             return; | ||||
|  | ||||
|         float fractionU = ImSaturate(1.0f+20*std::log10(volumeL)/60.0f); | ||||
|         float fractionD = ImSaturate(1.0f+20*std::log10(volumeR)/60.0f); | ||||
|  | ||||
|         *holdL = std::max(*holdL-0.005f,fractionU); | ||||
|         *holdR = std::max(*holdR-0.005f,fractionD); | ||||
|          | ||||
|         //Background | ||||
|         ImRect upbb(bb.Min, ImVec2(bb.Max.x, ImLerp(bb.Min.y, bb.Max.y, 0.4f))); | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, 0xff005500, 0.0f, 0.6f, 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, 0xff005555, 0.6f, 0.85f, 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, 0xff000055, 0.85f, 1.0f, 0.0f); | ||||
|  | ||||
|         ImRect dwbb(ImVec2(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, 0.6f)), bb.Max); | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, 0xff005500, 0.00f, 0.6f, 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, 0xff005555, 0.60f, 0.85f, 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, 0xff000055, 0.85f, 1.0f, 0.0f); | ||||
|  | ||||
|         //Bar | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, 0xff00ff00, 0.00f, 0.60f*ImSaturate(fractionU/0.6f), 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, 0xff00ffff, 0.60f, 0.60f+0.25f*ImSaturate((fractionU-0.6f)/0.25f), 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, 0xff0000ff, 0.85f, 0.85f+0.15f*ImSaturate((fractionU-0.85f)/0.15f), 0.0f); | ||||
|  | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, 0xff00ff00, 0.00f, 0.60f*ImSaturate(fractionD/0.6f), 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, 0xff00ffff, 0.60f, 0.60f+0.25f*ImSaturate((fractionD-0.6f)/0.25f), 0.0f); | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, 0xff0000ff, 0.85f, 0.85f+0.15f*ImSaturate((fractionD-0.85f)/0.15f), 0.0f); | ||||
|  | ||||
|         //Holders | ||||
|         RenderRectFilledRangeH(window->DrawList, upbb, GetColorU32(ImGuiCol_SliderGrab), *holdL, *holdL+0.01f, 0.0f); | ||||
|  | ||||
|         RenderRectFilledRangeH(window->DrawList, dwbb, GetColorU32(ImGuiCol_SliderGrab), *holdR, *holdR+0.01f, 0.0f); | ||||
|  | ||||
|      } | ||||
| } | ||||
							
								
								
									
										6
									
								
								core/src/imgui/imgui_custom.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								core/src/imgui/imgui_custom.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #pragma once | ||||
| #include "imgui.h" | ||||
|  | ||||
| namespace ImGui{ | ||||
|     IMGUI_API void VolumeBar(float volumeL, float volumeR, float *holdL, float *holdR, const ImVec2& size_arg); | ||||
| }; | ||||
| @@ -1,4 +1,5 @@ | ||||
| #include <imgui.h> | ||||
| #include <imgui_custom.h> | ||||
| #include <module.h> | ||||
| #include <watcher.h> | ||||
| #include <wav.h> | ||||
| @@ -58,6 +59,9 @@ public: | ||||
|         selectedStreamId = 0; | ||||
|         lastNameList = ""; | ||||
|  | ||||
|         volumeHold = {0}; | ||||
|         currentVolumePeak = {0}; | ||||
|  | ||||
|         config.aquire(); | ||||
|         if (!config.conf.contains(name)) { | ||||
|             config.conf[name]["recMode"] = 1; | ||||
| @@ -144,6 +148,12 @@ private: | ||||
|             ImGui::PopStyleColor(); | ||||
|         } | ||||
|  | ||||
|         { | ||||
|             std::lock_guard<std::mutex> lck(_this->volumeMtx); | ||||
|             ImGui::VolumeBar(_this->currentVolumePeak.l, _this->currentVolumePeak.r, &_this->volumeHold.l, &_this->volumeHold.r, ImVec2(-1.0f, 0.0f)); | ||||
|             _this->volumePeakShouldReset = true; | ||||
|         } | ||||
|  | ||||
|         // TODO: Change VFO ref in signal path | ||||
|         // TODO: Add VFO record | ||||
|         ImGui::Columns(2, CONCAT("RecordModeColumns##_", _this->name), false); | ||||
| @@ -191,6 +201,7 @@ private: | ||||
|                     sigpath::signalPath.unbindIQStream(_this->iqStream); | ||||
|                     _this->writer->close(); | ||||
|                     delete _this->writer; | ||||
|                     _this->currentVolumePeak = {0}; | ||||
|                     _this->recording = false; | ||||
|                 } | ||||
|                 uint64_t seconds = _this->samplesWritten / (uint64_t)_this->sampleRate; | ||||
| @@ -238,6 +249,7 @@ private: | ||||
|                     sigpath::sinkManager.unbindStream(_this->selectedStreamName, _this->audioStream); | ||||
|                     _this->writer->close(); | ||||
|                     delete _this->writer; | ||||
|                     _this->currentVolumePeak = {0}; | ||||
|                     _this->recording = false; | ||||
|                 } | ||||
|                 uint64_t seconds = _this->samplesWritten / (uint64_t)_this->sampleRate; | ||||
| @@ -253,6 +265,23 @@ private: | ||||
|         while (true) { | ||||
|             int count = _this->audioStream->read(); | ||||
|             if (count < 0) { break; } | ||||
|  | ||||
|             { | ||||
|                 std::lock_guard<std::mutex> lck(_this->volumeMtx); | ||||
|                 if (_this->volumePeakShouldReset) { | ||||
|                     _this->currentVolumePeak.l = 0.0f; | ||||
|                     _this->currentVolumePeak.r = 0.0f; | ||||
|                     _this->volumePeakShouldReset = false; | ||||
|                 } | ||||
|  | ||||
|                 for (int i = 0; i < count; i++) { | ||||
|                     _this->currentVolumePeak.l = std::max(_this->currentVolumePeak.l, | ||||
|                                                           std::abs(_this->audioStream->readBuf[i].l)); | ||||
|                     _this->currentVolumePeak.r = std::max(_this->currentVolumePeak.r, | ||||
|                                                           std::abs(_this->audioStream->readBuf[i].r)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             for (int i = 0; i < count; i++) { | ||||
|                 sampleBuf[(i * 2) + 0] = _this->audioStream->readBuf[i].l * 0x7FFF; | ||||
|                 sampleBuf[(i * 2) + 1] = _this->audioStream->readBuf[i].r * 0x7FFF; | ||||
| @@ -269,6 +298,23 @@ private: | ||||
|         while (true) { | ||||
|             int count = _this->iqStream->read(); | ||||
|             if (count < 0) { break; } | ||||
|  | ||||
|             { | ||||
|                 std::lock_guard<std::mutex> lck(_this->volumeMtx); | ||||
|                 if (_this->volumePeakShouldReset) { | ||||
|                     _this->currentVolumePeak.l = 0.0f; | ||||
|                     _this->currentVolumePeak.r = 0.0f; | ||||
|                     _this->volumePeakShouldReset = false; | ||||
|                 } | ||||
|  | ||||
|                 for (int i = 0; i < count; i++) { | ||||
|                     _this->currentVolumePeak.l = std::max(_this->currentVolumePeak.l, | ||||
|                                                           std::abs(_this->iqStream->readBuf[i].q)); | ||||
|                     _this->currentVolumePeak.r = std::max(_this->currentVolumePeak.r, | ||||
|                                                           std::abs(_this->iqStream->readBuf[i].i)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             for (int i = 0; i < count; i++) { | ||||
|                 sampleBuf[(i * 2) + 0] = _this->iqStream->readBuf[i].q * 0x7FFF; | ||||
|                 sampleBuf[(i * 2) + 1] = _this->iqStream->readBuf[i].i * 0x7FFF; | ||||
| @@ -284,6 +330,10 @@ private: | ||||
|     bool enabled = true; | ||||
|     char path[4096]; | ||||
|     bool pathValid = true; | ||||
|     std::mutex volumeMtx; | ||||
|     dsp::stereo_t currentVolumePeak; | ||||
|     dsp::stereo_t volumeHold; | ||||
|     bool volumePeakShouldReset; | ||||
|     dsp::stream<dsp::stereo_t>* audioStream; | ||||
|     dsp::stream<dsp::complex_t>* iqStream; | ||||
|     WavWriter* writer; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user