diff --git a/CMakeLists.txt b/CMakeLists.txt index d34b73c..59863d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,21 +87,50 @@ IF (WIN32) ENDIF (WIN32) -IF (UNIX) - set(RTLSDR_INCLUDE "/opt/local/include" CACHE FILEPATH "RTL-SDR Include Path") - set(RTLSDR_LIB "/opt/local/lib" CACHE FILEPATH "RTL-SDR Lib Path") +IF (UNIX AND NOT APPLE) + set(RTLSDR_INCLUDE "/usr/local/include" CACHE FILEPATH "RTL-SDR Include Path") + set(RTLSDR_LIB "/usr/local/lib" CACHE FILEPATH "RTL-SDR Lib Path") + set(USE_AUDIO_PULSE ON CACHE BOOL "Use Pulse Audio") + set(USE_AUDIO_JACK OFF CACHE BOOL "Use Jack Audio") + set(USE_AUDIO_ALSA OFF CACHE BOOL "Use ALSA Audio") + set(USE_AUDIO_OSS OFF CACHE BOOL "Use OSS Audio") include_directories(${RTLSDR_INCLUDE}) link_directories(${RTLSDR_LIB}) set(FFTW_LIB fftw3f) - ADD_DEFINITIONS( - # -D__UNIX_JACK__ - # -D__LINUX_ALSA__ - # -D__LINUX_PULSE__ - # -D__LINUX_OSS__ - ) -ENDIF(UNIX) +IF(USE_AUDIO_PULSE) + SET (OTHER_LIBRARIES ${OTHER_LIBRARIES} pulse-simple pulse) + ADD_DEFINITIONS( + -D__LINUX_PULSE__ + ) +ENDIF(USE_AUDIO_PULSE) + +IF(USE_AUDIO_JACK) + SET (OTHER_LIBRARIES ${OTHER_LIBRARIES} jack) + ADD_DEFINITIONS( + -D__UNIX_JACK__ + ) +ENDIF(USE_AUDIO_JACK) + +IF(USE_AUDIO_ALSA) + SET (OTHER_LIBRARIES ${OTHER_LIBRARIES} asound) + set(ALSA_INCLUDE_DIR "/usr/include" CACHE FILEPATH "ALSA include path") + include_directories(${ALSA_INCLUDE_DIR}) + set(ALSA_LIB_DIR "/usr/lib" CACHE FILEPATH "ALSA lib path") + link_directories(${ALSA_LIB_DIR}) + ADD_DEFINITIONS( + -D__LINUX_ALSA__ + ) +ENDIF(USE_AUDIO_ALSA) + +IF(USE_AUDIO_OSS) + SET (OTHER_LIBRARIES ${OTHER_LIBRARIES} oss) + ADD_DEFINITIONS( + -D__LINUX_OSS__ + ) +ENDIF(USE_AUDIO_OSS) +ENDIF(UNIX AND NOT APPLE) IF (APPLE) set(RTLSDR_INCLUDE "/opt/local/include" CACHE FILEPATH "RTL-SDR Include Path") diff --git a/README.md b/README.md index 8e7631b..a82249a 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Target Platforms: ---------------- - [x] OSX - [x] Windows - - [ ] Linux + - [x] Linux License: diff --git a/src/CubicSDRDefs.h b/src/CubicSDRDefs.h index 2f3d1a1..296bf2d 100644 --- a/src/CubicSDRDefs.h +++ b/src/CubicSDRDefs.h @@ -13,10 +13,17 @@ const char filePathSeparator = #ifdef __APPLE__ #define BUF_SIZE (16384*2) #define DEFAULT_SAMPLE_RATE 2000000 -#else +#endif +#ifdef __linux__ +#define BUF_SIZE (16384*6) +#define DEFAULT_SAMPLE_RATE 2000000 +#endif + +#ifndef BUF_SIZE #define BUF_SIZE (16384*5) #define DEFAULT_SAMPLE_RATE 2500000 #endif + #define DEFAULT_FFT_SIZE 2048 #define DEFAULT_FREQ 100000000 diff --git a/src/audio/AudioThread.cpp b/src/audio/AudioThread.cpp index f41d506..54eb656 100644 --- a/src/audio/AudioThread.cpp +++ b/src/audio/AudioThread.cpp @@ -4,7 +4,7 @@ #include #include "DemodulatorThread.h" -#ifdef __APPLE__ +#ifdef USE_MIXER std::map AudioThread::deviceController; std::map AudioThread::deviceThread; #endif @@ -12,18 +12,18 @@ std::map AudioThread::deviceThread; AudioThread::AudioThread(AudioThreadInputQueue *inputQueue, DemodulatorThreadCommandQueue* threadQueueNotify) : currentInput(NULL), inputQueue(inputQueue), audioQueuePtr(0), underflowCount(0), terminated(false), active(false), outputDevice(-1), gain( 1.0), threadQueueNotify(threadQueueNotify) { -#ifdef __APPLE__ +#ifdef USE_MIXER boundThreads = new std::vector; #endif } AudioThread::~AudioThread() { -#ifdef __APPLE__ +#ifdef USE_MIXER delete boundThreads.load(); #endif } -#ifdef __APPLE__ +#ifdef USE_MIXER void AudioThread::bindThread(AudioThread *other) { if (std::find(boundThreads.load()->begin(), boundThreads.load()->end(), other) == boundThreads.load()->end()) { boundThreads.load()->push_back(other); @@ -306,7 +306,7 @@ void AudioThread::setupDevice(int deviceId) { try { -#ifdef __APPLE__ +#ifdef USE_MIXER if (deviceController.find(outputDevice.load()) != deviceController.end()) { deviceController[outputDevice.load()]->removeThread(this); } @@ -388,12 +388,12 @@ void AudioThread::threadMain() { } } -#if !__APPLE__ +#if !USE_MIXER AudioThreadInput dummy; inputQueue->push(&dummy); #endif -#ifdef __APPLE__ +#ifdef USE_MIXER if (deviceController[parameters.deviceId] != this) { deviceController[parameters.deviceId]->removeThread(this); } else { @@ -440,7 +440,7 @@ bool AudioThread::isActive() { } void AudioThread::setActive(bool state) { -#ifdef __APPLE__ +#ifdef USE_MIXER AudioThreadInput *dummy; if (state && !active) { while (!inputQueue->empty()) { // flush queue diff --git a/src/audio/AudioThread.h b/src/audio/AudioThread.h index 649b07f..ede931b 100644 --- a/src/audio/AudioThread.h +++ b/src/audio/AudioThread.h @@ -18,6 +18,14 @@ #include "RtAudio.h" #include "DemodDefs.h" +#ifdef __APPLE__ +#define USE_MIXER 1 +#endif + +#ifdef __linux__ +#define USE_MIXER 1 +#endif + class AudioThreadInput: public ReferenceCounter { public: long long frequency; @@ -90,7 +98,7 @@ private: AudioThreadCommandQueue cmdQueue; DemodulatorThreadCommandQueue* threadQueueNotify; -#ifdef __APPLE__ +#ifdef USE_MIXER public: void bindThread(AudioThread *other); void removeThread(AudioThread *other); diff --git a/src/util/MouseTracker.cpp b/src/util/MouseTracker.cpp index e9a7dad..5c6c396 100644 --- a/src/util/MouseTracker.cpp +++ b/src/util/MouseTracker.cpp @@ -27,6 +27,7 @@ void MouseTracker::OnMouseMoved(wxMouseEvent& event) { if (isMouseDown || isMouseRightDown) { #ifndef __APPLE__ +#ifndef __linux__ if (horizDragLock && vertDragLock) { target->WarpPointer(originMouseX * ClientSize.x, (1.0 - originMouseY) * ClientSize.y); mouseX = originMouseX; @@ -38,6 +39,7 @@ void MouseTracker::OnMouseMoved(wxMouseEvent& event) { target->WarpPointer(originMouseX * ClientSize.x, event.m_y); mouseX = originMouseX; } +#endif #endif } diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index 598fea8..9b2d06e 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -54,11 +54,13 @@ void PrimaryGLContext::CheckGLError() { PrimaryGLContext::PrimaryGLContext(wxGLCanvas *canvas, wxGLContext *sharedContext) : wxGLContext(canvas, sharedContext) { SetCurrent(*canvas); +#ifndef __linux__ // Pre-load fonts for (int i = 0; i < GLFONT_MAX; i++) { getFont((GLFontSize) i); } CheckGLError(); +#endif } GLFont &PrimaryGLContext::getFont(GLFontSize esize) { diff --git a/src/visual/WaterfallContext.cpp b/src/visual/WaterfallContext.cpp index 6aeef55..031fd02 100644 --- a/src/visual/WaterfallContext.cpp +++ b/src/visual/WaterfallContext.cpp @@ -20,23 +20,6 @@ void WaterfallContext::Setup(int fft_size_in, int num_waterfall_lines_in) { waterfall_tex = new unsigned char[fft_size * waterfall_lines]; memset(waterfall_tex, 0, fft_size * waterfall_lines); - - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glGenTextures(1, &waterfall); - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, waterfall); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } void WaterfallContext::refreshTheme() { @@ -51,6 +34,19 @@ void WaterfallContext::refreshTheme() { void WaterfallContext::Draw(std::vector &points) { + if (!waterfall) { + glGenTextures(1, &waterfall); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, waterfall); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + if (activeTheme != ThemeMgr::mgr.currentTheme) { refreshTheme(); activeTheme = ThemeMgr::mgr.currentTheme;