summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.common7
-rw-r--r--gnuradio-core/src/lib/runtime/gr_unittests.h9
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr_unittest.py37
-rw-r--r--gr-audio-alsa/src/audio_alsa_sink.cc22
-rw-r--r--gr-audio-alsa/src/audio_alsa_sink.h1
-rw-r--r--gruel/src/lib/test_gruel.cc9
6 files changed, 50 insertions, 35 deletions
diff --git a/Makefile.common b/Makefile.common
index d3d9b2463..20b8a78cf 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -129,6 +129,13 @@ gr_prefsdir = $(GR_PREFSDIR)
# Data directory for grc block wrappers
grc_blocksdir = $(pkgdatadir)/grc/blocks
+# Other common defines; use "+=" to add to these
+STAMPS =
+MOSTLYCLEANFILES = $(BUILT_SOURCES) $(STAMPS) *.pyc *.pyo *~ *.tmp *.loT \
+ .unittests/* .unittests/python/*
+
+# Don't distribute the files defined in the variable 'no_dist_files'
+
dist-hook:
@for file in $(no_dist_files); do \
echo $(RM) $(distdir)/$$file; \
diff --git a/gnuradio-core/src/lib/runtime/gr_unittests.h b/gnuradio-core/src/lib/runtime/gr_unittests.h
index 680e59ca4..70aa6f294 100644
--- a/gnuradio-core/src/lib/runtime/gr_unittests.h
+++ b/gnuradio-core/src/lib/runtime/gr_unittests.h
@@ -45,14 +45,13 @@
*/
static void
-ensure_unittest_path (const char *grpath, const char *path)
+ensure_unittest_path (const char *path)
{
struct stat statbuf;
if (stat (path, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
return;
// blindly try to make it // FIXME make this robust. C++ SUCKS!
- gr_mkdir (grpath, 0750);
gr_mkdir (path, 0750);
}
@@ -60,11 +59,9 @@ static void
get_unittest_path (const char *filename, char *fullpath, size_t pathsize)
{
char path[200];
- char grpath[200];
- snprintf (grpath, sizeof(grpath), "%s/.gnuradio", getenv ("HOME"));
- snprintf (path, sizeof(path), "%s/unittests", grpath);
+ snprintf (path, sizeof(path), "./.unittests");
snprintf (fullpath, pathsize, "%s/%s", path, filename);
- ensure_unittest_path(grpath, path);
+ ensure_unittest_path(path);
}
diff --git a/gnuradio-core/src/python/gnuradio/gr_unittest.py b/gnuradio-core/src/python/gnuradio/gr_unittest.py
index 50d484a76..c2c4df2ba 100755
--- a/gnuradio-core/src/python/gnuradio/gr_unittest.py
+++ b/gnuradio-core/src/python/gnuradio/gr_unittest.py
@@ -38,7 +38,7 @@ class TestCase(unittest.TestCase):
Note that decimal places (from zero) is usually not the same
as significant digits (measured from the most signficant digit).
- """
+ """
if round(second.real-first.real, places) != 0:
raise self.failureException, \
(msg or '%s != %s within %s places' % (`first`, `second`, `places` ))
@@ -112,30 +112,31 @@ def run(PUT, filename=None):
Runs the unittest on a TestCase and produces an optional XML report
PUT: the program under test and should be a gr_unittest.TestCase
filename: an optional filename to save the XML report of the tests
- this will live in $HOME/.gnuradio/unittests/python
+ this will live in ./.unittests/python
'''
# Run this is given a file name
if(filename is not None):
- homepath = os.getenv("HOME")
- basepath = homepath + "/.gnuradio"
- path = homepath + "/.gnuradio/unittests/python"
+ basepath = "./.unittests"
+ path = basepath + "/python"
+
+ if not os.path.exists(basepath):
+ os.makedirs(basepath, 0750)
xmlrunner = None
- if os.path.exists(basepath):
- # only proceed if $HOME/.gnuradio is writable
- st = os.stat(basepath)[stat.ST_MODE]
+ # only proceed if .unittests is writable
+ st = os.stat(basepath)[stat.ST_MODE]
+ if(st & stat.S_IWUSR > 0):
+ # Test if path exists; if not, build it
+ if not os.path.exists(path):
+ os.makedirs(path, 0750)
+
+ # Just for safety: make sure we can write here, too
+ st = os.stat(path)[stat.ST_MODE]
if(st & stat.S_IWUSR > 0):
- # Test if path exists; if not, build it
- if not os.path.exists(path):
- os.makedirs(path, 0750)
-
- # Just for safety: make sure we can write here, too
- st = os.stat(path)[stat.ST_MODE]
- if(st & stat.S_IWUSR > 0):
- # Create an XML runner to filename
- fout = file(path+"/"+filename, "w")
- xmlrunner = gr_xmlrunner.XMLTestRunner(fout)
+ # Create an XML runner to filename
+ fout = file(path+"/"+filename, "w")
+ xmlrunner = gr_xmlrunner.XMLTestRunner(fout)
txtrunner = TextTestRunner(verbosity=1)
diff --git a/gr-audio-alsa/src/audio_alsa_sink.cc b/gr-audio-alsa/src/audio_alsa_sink.cc
index d6b7f84cf..d44a93b3f 100644
--- a/gr-audio-alsa/src/audio_alsa_sink.cc
+++ b/gr-audio-alsa/src/audio_alsa_sink.cc
@@ -90,7 +90,7 @@ audio_alsa_sink::audio_alsa_sink (int sampling_rate,
d_period_size (0),
d_buffer_size_bytes (0), d_buffer (0),
d_worker (0), d_special_case_mono_to_stereo (false),
- d_nunderuns (0), d_nsuspends (0)
+ d_nunderuns (0), d_nsuspends (0), d_ok_to_block(ok_to_block)
{
CHATTY_DEBUG = gr_prefs::singleton()->get_bool("audio_alsa", "verbose", false);
@@ -100,6 +100,8 @@ audio_alsa_sink::audio_alsa_sink (int sampling_rate,
// open the device for playback
error = snd_pcm_open(&d_pcm_handle, d_device_name.c_str (),
SND_PCM_STREAM_PLAYBACK, 0);
+ if (ok_to_block == false)
+ snd_pcm_nonblock(d_pcm_handle, !ok_to_block);
if (error < 0){
fprintf (stderr, "audio_alsa_sink[%s]: %s\n",
d_device_name.c_str(), snd_strerror(error));
@@ -219,9 +221,15 @@ audio_alsa_sink::check_topology (int ninputs, int noutputs)
int nchan = ninputs;
int err;
- // FIXME check_topology may be called more than once.
+ // Check the state of the stream
// Ensure that the pcm is in a state where we can still mess with the hw_params
-
+ snd_pcm_state_t state;
+ state=snd_pcm_state(d_pcm_handle);
+ if ( state== SND_PCM_STATE_RUNNING)
+ return true; // If stream is running, don't change any parameters
+ else if(state == SND_PCM_STATE_XRUN )
+ snd_pcm_prepare ( d_pcm_handle ); // Prepare stream on underrun, and we can set parameters;
+
bool special_case = nchan == 1 && d_special_case_mono_to_stereo;
if (special_case)
nchan = 2;
@@ -287,7 +295,6 @@ audio_alsa_sink::check_topology (int ninputs, int noutputs)
default:
assert (0);
}
-
return true;
}
@@ -489,7 +496,12 @@ audio_alsa_sink::write_buffer (const void *vbuffer,
while (nframes > 0){
int r = snd_pcm_writei (d_pcm_handle, buffer, nframes);
if (r == -EAGAIN)
- continue; // try again
+ {
+ if (d_ok_to_block == true)
+ continue; // try again
+
+ break;
+ }
else if (r == -EPIPE){ // underrun
d_nunderuns++;
diff --git a/gr-audio-alsa/src/audio_alsa_sink.h b/gr-audio-alsa/src/audio_alsa_sink.h
index d4b540382..f3007f60f 100644
--- a/gr-audio-alsa/src/audio_alsa_sink.h
+++ b/gr-audio-alsa/src/audio_alsa_sink.h
@@ -83,6 +83,7 @@ class audio_alsa_sink : public gr_sync_block {
// random stats
int d_nunderuns; // count of underruns
int d_nsuspends; // count of suspends
+ bool d_ok_to_block; // defaults to "true", controls blocking/non-block I/O
void output_error_msg (const char *msg, int err);
void bail (const char *msg, int err) throw (std::runtime_error);
diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc
index f4b9fc4e2..2c9528b0a 100644
--- a/gruel/src/lib/test_gruel.cc
+++ b/gruel/src/lib/test_gruel.cc
@@ -65,14 +65,13 @@ main(int argc, char **argv)
*/
static void
-ensure_unittest_path (const char *grpath, const char *path)
+ensure_unittest_path (const char *path)
{
struct stat statbuf;
if (stat (path, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
return;
// blindly try to make it // FIXME make this robust. C++ SUCKS!
- gr_mkdir (grpath, 0750);
gr_mkdir (path, 0750);
}
@@ -80,11 +79,9 @@ static void
get_unittest_path (const char *filename, char *fullpath, size_t pathsize)
{
char path[200];
- char grpath[200];
- snprintf (grpath, sizeof(grpath), "%s/.gnuradio", getenv ("HOME"));
- snprintf (path, sizeof(path), "%s/unittests", grpath);
+ snprintf (path, sizeof(path), "./.unittests");
snprintf (fullpath, pathsize, "%s/%s", path, filename);
- ensure_unittest_path(grpath, path);
+ ensure_unittest_path(path);
}