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

Reply via email to