On Sun, Mar 22, 2015 at 6:29 PM, Vijay Galbaransingh <vij...@sfu.ca> wrote:
> Hi guys, > > Still stuck, but some relevant details have changed that may help answer my > question. So I'm trying to implement a sink block for gnuradio-android that > takes integers on its input (not chars as I had erroneously written before) > and stores the last 'length' items in a LIFO buffer; the buffer's contents > are written to an Android TextView object every time the block's work > function is called. Following is the constructor I have written in order to > pass this block the JNIEnv and jobject variables it needs in order to > access > the methods of my TextView instance: > > stream_to_tv_sink_impl::stream_to_tv_sink_impl(JNIEnv *env, jobject > jtv, > int length) > : gr::sync_block("stream_to_tv_sink", > gr::io_signature::make(1, 1, sizeof(int), > gr::io_signature::make(0, 0, 0)), > d_env(env), > d_jtv(jtv), > d_length(length) > { > d_buffer = new string[length]; > for(int i = 0; i < length; i++) { > d_buffer[i] = "0"; > } > d_output = "Nothing yet..."; > jclass d_cls = env->GetObjectClass(jtv); > jmethodID d_mid = env->GetMethodID(d_cls, "setText", > "(Ljava/lang/CharSequence;)V"); > } > > And here is my work function: > > int > stream_to_tv_sink_impl::work(int noutput_items, > gr_vector_const_void_star &input_items, > gr_vector_void_star &output_items) > { > const int *in = (const int *) input_items[0]; > > // Update LIFO > for(int i = d_length - 1; i > 0; i--) { > d_buffer[i] = d_buffer[i-1]; > } > d_buffer[0] = to_string(in[0]); > > // Construct output string, newest >> oldest (left to right) > d_output = d_buffer[0]; > for(int i = 1; i < d_length; i++) { > d_output += " " + d_buffer[i]; > } > > // Display output string -- Invoke setText method > d_env->CallVoidMethod(d_jtv, d_mid, > d_env->NewStringUTF(d_output.c_str())); // Might need to do this j times > for > j < noutput_items > > // Tell runtime system how many output items we produced. > return noutput_items; > } > > Where I am stuck is I cannot figure out how to come up with the appropriate > makefile (using cmake or otherwise) to build this block into a prebuilt > static library so that I may use it in my Android flowgraph, as shown for > example in the instructions for building GNU Radio for Android and GRAnd at > https://gnuradio.org/redmine/projects/gnuradio/wiki/GRAndBuild. I don't > have > much experience tinkering with cmake but I've been looking over the cmake > files in GRAnd and the android fork of gnuradio and I can't figure out how > to properly link to the JNI library to build this thing -- or if statically > linking to JNI types and methods in this manner is even possible. If it > isn't, I'm open to suggestions for alternative methods of displaying the > flowgraph's end results in my Android app; at the moment my flowgraph > terminates in a file sink, and the app reads/displays a few entries from > the > file, but this not a good solution for when the flowgraph is running for > more than 10 or 15 seconds. > > Any advice appreciated, > Vijay Hi Vijay, So at this point I think you might be the person with the second most experience with GNU Radio on Android and therefore the second most qualified to answer the question :) I'm sitting in Android sessions at ELC right now, though, so I can't go into details really here. All I'll say is to look closer at gr-grand. Specifically, look at the float_array block that I wrote. It uses jfloatArray and JNIEnv in creating this block, very much like how you want to handle your block. I might suggest adding your block (using gr_modtool add in your checkout of gr-grand) directly to gr-grand and try and build it there, since that CMake handles the necessary includes/libs/etc that you need to get the linking to work. That might at least get you to a buildable block for your purposes. It might then help you understand what you need to do with your own OOT projects CMake files. Tom > -----Original Message----- > From: discuss-gnuradio-bounces+vijayg=sfu...@gnu.org > [mailto:discuss-gnuradio-bounces+vijayg=sfu...@gnu.org] On Behalf Of Vijay > Galbaransingh > Sent: March-21-15 00:51 > To: 'Tom Rondeau' > Cc: 'GNURadio Discussion List' > Subject: Re: [Discuss-gnuradio] GNU Radio on Android > > Hi guys, > > I am attempting to write an OOT module to be implemented on Android and am > finding myself out of my depth here. > > As a first step I was able to make and execute my flowgraph on my android > device following the instructions on the wiki, using a file sink to store > my > end result (demodulated string.) > > Now I would like to create my own sink which takes char inputs and updates > a > TextView object as they are ‘spat out’ by the flowgraph. I followed the > general instructions on the wiki for coding an OOT module/object, so > gr_modtool generated all the boiler plate code and I have modified it > accordingly. > > Where I am hitting an issue is that I must pass JNIEnv* and jobject > arguments to my make (hence impl) functions in order to interact with the > TextView object in my work function… but when I try to build the module I > get the following error for example: “error: 'JNIEnv' has not been > declared”, > and similarly for all the jobject, jclass, and jmethodID occurrences. It > would seem make doesn’t know how to find the JNI libraries (and I’m > guessing > volk is missing too,) and I’m unsure how to tell it where to look. Any > thoughts? Or is there a smarter / less roundabout way altogether to display > my flowgraph output in my Android activity? > > Thanks, > Vijay > > From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of > Tom > Rondeau > Sent: March-19-15 07:36 > To: Vijay Galbaransingh > Cc: GNURadio Discussion List > Subject: Re: [Discuss-gnuradio] GNU Radio on Android > > On Thu, Mar 19, 2015 at 3:28 AM, Vijay Galbaransingh <vij...@sfu.ca> > wrote: > Tom, > > As you expected, disabling buffering on the file sink did not have any > effect. I have fixed the issue though by making two changes to > opensl_source_impl.cc: > 1) change scale_factor to 32768 (1/2^14 doesn't make sense, it causes > clipping because the volk conversion method divides by scale_factor.) > 2) change buffer size (d_size) to 8k (2k was too small, tested > 32/44.1/48kHz > on Nexus 4 and Nexus 7 2012 version.) Without this change the recorded > audio > will be very choppy (dropped samples?) > > Vijay > > Ah, ok, that makes sense. I think I was just playing around with those > parameters and must have checked them in at that state. > > I'll make those updates to the repo. > > Thanks. > Tom > > > > From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of > Tom > Rondeau > Sent: March-18-15 07:11 > To: Vijay Galbaransingh > Cc: GNURadio Discussion List > Subject: Re: [Discuss-gnuradio] GNU Radio on Android > > On Wed, Mar 18, 2015 at 1:46 AM, Vijay Galbaransingh <vij...@sfu.ca> > wrote: > Tom, > > What kind of sample rate / setup are you using for your opensl_source? I've > set up a flowgraph that is just an opensl_source (sampling at 48kHz) > connected to a file sink, and when I play back the file through GRC on my > desktop my audio is coming out pretty garbled, as if samples are being > dropped. I've also tried a couple other sampling rates (44.1kHz, 32kHz, > 16kHz to name a few.) I'm using a Nexus 4 running Android 5.0.1. Pasted > below is some of my code. > > Vijay > > Flowgraph code: > JNIEXPORT void JNICALL > Java_com_example_grrecordmic_GrRecordMic_InitFlowgraph(JNIEnv* env, jobject > thiz, jstring jsinkfilename) > { > int rate = 48000; > const char *sinkfilename = env->GetStringUTFChars(jsinkfilename, 0); > > global_tb = gr::make_top_block("Record_Mic"); > > gr::grand::opensl_source::sptr micSource = > gr::grand::opensl_source::make(rate); > gr::blocks::file_sink::sptr fileSink = > gr::blocks::file_sink::make(sizeof(float), sinkfilename, false); > > global_tb->connect(micSource, 0, fileSink, 0); > > env->ReleaseStringUTFChars(jsinkfilename, sinkfilename); > } > > I believe that I used either 32k and/or 44.1k. I was using a Nexus 7, > though, and the codec might play a significant role with this between the > two devices. > > Perhaps try setting the file sink to unbuffered mode? > > fileSink->set_unbuffered(true); > > Frankly, I feel like this is unlikely to help, but it'll be interesting to > know what happens. > > Tom > > > From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of > Tom > Rondeau > Sent: March-17-15 07:37 > To: Vijay Galbaransingh > Cc: GNURadio Discussion List > Subject: Re: [Discuss-gnuradio] GNU Radio on Android > > On Tue, Mar 17, 2015 at 12:10 AM, Vijay Galbaransingh <vij...@sfu.ca> > wrote: > Thanks Tom, that sorted it out. My audio output is a bit choppy but no > matter – time to move on to some more complex flowgraphs in my Android app. > > Thanks again, > Vijay > > Yes, the skipping in the audio output is a known bug, and apparently known > to be difficult in Android. It's going to take some kind of double > buffering > to fix it at this level. I did not experience any problems with the audio > source, though; I just saved it to a file, brought it back to my computer, > and played it there and it sounded fine. > > Tom > > > > From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of > Tom > Rondeau > Sent: March-16-15 06:37 > To: Vijay Galbaransingh > Cc: GNURadio Discussion List > Subject: Re: [Discuss-gnuradio] GNU Radio on Android > > On Mon, Mar 16, 2015 at 3:28 AM, Vijay Galbaransingh <vij...@sfu.ca> > wrote: > Hi Tom, > > I have been following your notes on the wiki in an attempt to build a test > app (a dial tone flowgraph.) I'm hitting a snag on the ndk-build step > though -- when I use your example Android.mk listing, the linker isn't > finding any of the static libraries we built (gnuradio, grand, boost, > fftw.) > Instead I'm getting a pile of undefined reference errors. > > I tried editing the example Android.mk file by adding the following before > the shared library build: > > include $(CLEAR_VARS) > LOCAL_MODULE := grand_static_lib #for example > LOCAL_SRC_FILES := /opt/grandroid/lib/libgnuradio-grand.a > include $(PREBUILT_STATIC_LIBRARY) > > However I quickly realised that while there are only a few gnuradio > libraries to add this way, there are a ton of boost libraries... Is there a > smarter way to add all the prebuilt .a libraries at once? Or am I headed in > the wrong direction entirely? > > Any tips appreciated, > Vijay > > > Yep, you have to add all of the libraries into the Android.mk file. I've > updated the wiki: > > http://gnuradio.org/redmine/projects/gnuradio/wiki/GRAndApps > > You can go there and simply download GrAndroid.mk that does all of this for > you and include it in your Android.mk file. Just follow the instructions. > > Hope that helps, > > Tom > > > > From: trond...@trondeau.com [mailto:trond...@trondeau.com] On Behalf Of > Tom > Rondeau > Sent: March-13-15 14:41 > To: Vijay Galbaransingh > Cc: GNURadio Discussion List > Subject: Re: [Discuss-gnuradio] GNU Radio on Android > On Fri, Mar 13, 2015 at 5:04 PM, Vijay Galbaransingh <vij...@sfu.ca> > wrote: > Hi, > > Has a patched version of GNU Radio which runs on Android been released? > > I'm working on a project where I'm transmitting information over audio > from a desktop system to an Android device, and since setting up the > transmitter end with GNU Radio was such a snap I would love to leverage > the GNU Radio system to build the receiver as well. > > Thanks, > Vijay > > Just yesterday, in fact: > > http://gnuradio.org/redmine/projects/gnuradio/wiki/Android > > I'll try to release some of my apps soon. One of them captures from the > audio device, even. It's not too hard since there's the gr-grand opensl > audio source block to talk to the audio system. > > Tom > > > _______________________________________________ > Discuss-gnuradio mailing list > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio >
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio