From 21578a555e4ecfa9ce353b1b8a7f6342743769bb Mon Sep 17 00:00:00 2001 From: John Greb Date: Mon, 1 Dec 2014 16:56:27 +0000 Subject: [PATCH] FCD Streaming. --- plugins/samplesource/fcd/fcdsource.cpp | 20 ++++++++++++++++---- plugins/samplesource/fcd/fcdthread.cpp | 4 +++- plugins/samplesource/fcd/fcdthread.h | 3 +-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/samplesource/fcd/fcdsource.cpp b/plugins/samplesource/fcd/fcdsource.cpp index da8fdbe9b..eef019371 100644 --- a/plugins/samplesource/fcd/fcdsource.cpp +++ b/plugins/samplesource/fcd/fcdsource.cpp @@ -7,16 +7,27 @@ bool FCDThread::OpenSource(const char* cardname) { + snd_pcm_hw_params_t* params; //fcd_rate = FCDPP_RATE; //fcd_channels =2; //fcd_format = SND_PCM_SFMT_U16_LE; - fcd_stream = SND_PCM_STREAM_PLAYBACK; + snd_pcm_stream_t fcd_stream = SND_PCM_STREAM_CAPTURE; if (fcd_handle) return false; - if ( snd_pcm_open( &fcd_handle, cardname, fcd_stream, 1 ) < 0 ) + if ( snd_pcm_open( &fcd_handle, cardname, fcd_stream, 0 ) < 0 ) return false; + snd_pcm_hw_params_alloca(¶ms); + if ( snd_pcm_hw_params_any(fcd_handle, params) < 0 ) + qCritical("Funcube Dongle read settings failed"); + else if ( snd_pcm_hw_params(fcd_handle, params) < 0 ) + qCritical("Funcube Dongle write settings failed"); + // TODO: check actual samplerate, may be crippled firmware + + if ( snd_pcm_start(fcd_handle) < 0 ) + qCritical("Funcube Dongle stream start failed"); + else qDebug("Funcube stream started"); return true; } @@ -32,7 +43,7 @@ void FCDThread::set_center_freq(double freq) //TODO } -void FCDThread::work(int n_items) +int FCDThread::work(int n_items) { int l; SampleVector::iterator it; @@ -40,9 +51,10 @@ void FCDThread::work(int n_items) it = m_convertBuffer.begin(); out = (void *)&it[0]; - l = snd_pcm_readi(fcd_handle, out, (snd_pcm_uframes_t)n_items); + l = snd_pcm_mmap_readi(fcd_handle, out, (snd_pcm_uframes_t)n_items); if (l > 0) m_sampleFifo->write(it, it + l); + return l; } diff --git a/plugins/samplesource/fcd/fcdthread.cpp b/plugins/samplesource/fcd/fcdthread.cpp index 6ae4850f9..beacfe2cb 100644 --- a/plugins/samplesource/fcd/fcdthread.cpp +++ b/plugins/samplesource/fcd/fcdthread.cpp @@ -44,9 +44,11 @@ void FCDThread::run() m_running = true; if ( !OpenSource("hw:CARD=V20") ) return; + // TODO: fallback to original fcd while(m_running) { - work(BLOCKSIZE); + if ( work(BLOCKSIZE) < 0) + break; } CloseSource(); } diff --git a/plugins/samplesource/fcd/fcdthread.h b/plugins/samplesource/fcd/fcdthread.h index bda2e1f0d..54aabb77a 100644 --- a/plugins/samplesource/fcd/fcdthread.h +++ b/plugins/samplesource/fcd/fcdthread.h @@ -39,11 +39,10 @@ public: bool OpenSource(const char *filename); void CloseSource(); void set_center_freq(double freq); - void work(int n_items); + int work(int n_items); private: snd_pcm_format_t fcd_format; snd_pcm_t* fcd_handle = NULL; - snd_pcm_stream_t fcd_stream; QMutex m_startWaitMutex; QWaitCondition m_startWaiter;