From 46dcbe6db7f2c72fb0c124aceeec824953b8b29b Mon Sep 17 00:00:00 2001 From: John Greb Date: Sun, 30 Nov 2014 21:59:06 +0000 Subject: [PATCH] Open FCD. --- Readme.md | 2 ++ plugins/samplesource/CMakeLists.txt | 4 +++ plugins/samplesource/fcd/CMakeLists.txt | 2 +- plugins/samplesource/fcd/fcdsource.cpp | 48 +++++++++++++++++++++++++ plugins/samplesource/fcd/fcdthread.cpp | 3 +- plugins/samplesource/fcd/fcdthread.h | 16 ++++----- plugins/samplesource/v4l/CMakeLists.txt | 1 - 7 files changed, 63 insertions(+), 13 deletions(-) diff --git a/Readme.md b/Readme.md index bf4667c51..5a3088b93 100644 --- a/Readme.md +++ b/Readme.md @@ -5,6 +5,8 @@ For Ubuntu: "librtlsdr-dev" is in the "universe" repo. (utopic 14.10 amd64.) +Funcube Dongle Pro+ support needs package "libasound2-dev" + Use "cmake ../ -DKERNEL=ON" to build the Linux kernel driver (Experimental). Needs a recent kernel and libv4l2. Will need extra work to support Airspy and Hackrf. Needs "cp KERNEL_SOURCE/include/linux/compiler.h /usr/include/linux/" and "cp KERNEL_SOURCE/include/uapi/linux/videodev2.h /usr/include/uapi/linux/" and package "libv4l-dev". The Gnuradio plugin source needs extra packages, including "liblog4cpp-dev libboost-system-dev gnuradio-dev libosmosdr-dev" diff --git a/plugins/samplesource/CMakeLists.txt b/plugins/samplesource/CMakeLists.txt index b12ef2de7..135eb0a5f 100644 --- a/plugins/samplesource/CMakeLists.txt +++ b/plugins/samplesource/CMakeLists.txt @@ -18,6 +18,10 @@ else() endif() if(LIBUSB_FOUND AND UNIX) + FIND_PATH (ASOUNDH alsa/asoundlib.h) + FIND_LIBRARY (LIBASOUND asound) +endif() +if(LIBASOUND AND ASOUNDH) add_subdirectory(fcd) endif() diff --git a/plugins/samplesource/fcd/CMakeLists.txt b/plugins/samplesource/fcd/CMakeLists.txt index 14807c754..508b4ae86 100644 --- a/plugins/samplesource/fcd/CMakeLists.txt +++ b/plugins/samplesource/fcd/CMakeLists.txt @@ -13,7 +13,6 @@ set(rtlsdr_HEADERS fcdinput.h fcdplugin.h fcdthread.h - fcdsource.h ) set(fcd_FORMS @@ -43,6 +42,7 @@ add_library(inputfcd SHARED target_link_libraries(inputfcd ${QT_LIBRARIES} + asound sdrbase ) diff --git a/plugins/samplesource/fcd/fcdsource.cpp b/plugins/samplesource/fcd/fcdsource.cpp index e69de29bb..da8fdbe9b 100644 --- a/plugins/samplesource/fcd/fcdsource.cpp +++ b/plugins/samplesource/fcd/fcdsource.cpp @@ -0,0 +1,48 @@ +/* (C)2015 John Greb + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public Licence version 3. + */ + +#include "fcdthread.h" + +bool FCDThread::OpenSource(const char* cardname) +{ + //fcd_rate = FCDPP_RATE; + //fcd_channels =2; + //fcd_format = SND_PCM_SFMT_U16_LE; + fcd_stream = SND_PCM_STREAM_PLAYBACK; + + if (fcd_handle) + return false; + if ( snd_pcm_open( &fcd_handle, cardname, fcd_stream, 1 ) < 0 ) + return false; + + return true; +} + +void FCDThread::CloseSource() +{ + if (fcd_handle) + snd_pcm_close( fcd_handle ); + fcd_handle = NULL; +} + +void FCDThread::set_center_freq(double freq) +{ + //TODO +} + +void FCDThread::work(int n_items) +{ + int l; + SampleVector::iterator it; + void *out; + + it = m_convertBuffer.begin(); + out = (void *)&it[0]; + l = snd_pcm_readi(fcd_handle, out, (snd_pcm_uframes_t)n_items); + if (l > 0) + m_sampleFifo->write(it, it + l); +} + + diff --git a/plugins/samplesource/fcd/fcdthread.cpp b/plugins/samplesource/fcd/fcdthread.cpp index 8628094e6..6ae4850f9 100644 --- a/plugins/samplesource/fcd/fcdthread.cpp +++ b/plugins/samplesource/fcd/fcdthread.cpp @@ -42,8 +42,7 @@ void FCDThread::stopWork() void FCDThread::run() { m_running = true; - OpenSource("/dev/dsp"); - if (fd < 0) + if ( !OpenSource("hw:CARD=V20") ) return; while(m_running) { diff --git a/plugins/samplesource/fcd/fcdthread.h b/plugins/samplesource/fcd/fcdthread.h index e62c09c54..bda2e1f0d 100644 --- a/plugins/samplesource/fcd/fcdthread.h +++ b/plugins/samplesource/fcd/fcdthread.h @@ -23,8 +23,9 @@ #include #include "dsp/samplefifo.h" #include "dsp/inthalfbandfilter.h" +#include -#define SAMPLERATE 192000 +#define FCDPP_RATE 192000 #define BLOCKSIZE 8192 class FCDThread : public QThread { @@ -35,17 +36,14 @@ public: ~FCDThread(); void stopWork(); - void OpenSource(const char *filename); + bool OpenSource(const char *filename); void CloseSource(); void set_center_freq(double freq); - int work(int n_items); + void work(int n_items); private: - int fd; - struct fcd_buffer *buffers; - unsigned int n_buffers; - void *recebuf_ptr; - unsigned int recebuf_len; - unsigned int recebuf_mmap_index; + snd_pcm_format_t fcd_format; + snd_pcm_t* fcd_handle = NULL; + snd_pcm_stream_t fcd_stream; QMutex m_startWaitMutex; QWaitCondition m_startWaiter; diff --git a/plugins/samplesource/v4l/CMakeLists.txt b/plugins/samplesource/v4l/CMakeLists.txt index d9360626e..02923eb40 100644 --- a/plugins/samplesource/v4l/CMakeLists.txt +++ b/plugins/samplesource/v4l/CMakeLists.txt @@ -13,7 +13,6 @@ set(rtlsdr_HEADERS v4linput.h v4lplugin.h v4lthread.h - v4lsource.h ) set(v4l_FORMS