No worries.

Had a week off in summer and spent some of it watching the tennis in
the sweltering heat and learning how the AudioRecord and AudioTrack
stuff works.
Just polishing some of it up to release my first app, but glad it
could be of use to someone else as well.

I look forward to that pint ;-)

Mike

On Jan 21, 5:23 pm, Donal Rafferty <draf...@gmail.com> wrote:
> Thanks Mike,
>
> Your a legend, have that working now,
>
> I owe you a pint!
>
> Many thanks,
> Regards,
> Donal
>
> On Thu, Jan 21, 2010 at 5:02 PM, Michael <nicholls...@googlemail.com> wrote:
> > Hi Donal,
>
> > I have pulled together some of my code to form an example. I have no
> > idea if this code would compile, but it should be pretty close and
> > should serve as an example to get you going.
>
> >                android.os.Process.setThreadPriority
> > (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
>
> >                int buffersize = AudioRecord.getMinBufferSize(11025,
> > AudioFormat.CHANNEL_CONFIGURATION_MONO,
> > AudioFormat.ENCODING_PCM_16BIT);
>
> >                AudioRecord arec = new
> > AudioRecord(MediaRecorder.AudioSource.MIC,
> >                                11025,
> >                                AudioFormat.CHANNEL_CONFIGURATION_MONO,
> >                                AudioFormat.ENCODING_PCM_16BIT,
> >                                buffersize);
>
> >                AudioTrack atrack = new
> > AudioTrack(AudioManager.STREAM_MUSIC,
> >                                11025,
> >                                AudioFormat.CHANNEL_CONFIGURATION_MONO,
> >                                AudioFormat.ENCODING_PCM_16BIT,
> >                                ba.size(),
> >                                AudioTrack.MODE_STREAMING);
>
> >                atrack.setPlaybackRate(11025);
>
> >                byte[] buffer = new byte[buffersize];
> >                arec.startRecording();
> >                atrack.play();
>
> >                while(isRecording) {
> >                        arec.read(buffer, 0, buffersize);
> >                        try {
> >                                atrack.write(buffer, 0, buffer.size());
> >                        } catch (IOException e) {
>
> >                                e.printStackTrace();
> >                        }
> >                }
>
> >                arec.stop();
> >                atrack.stop();
>
> > This sets up an AudioRecord and an AudioTrack, tells the one to record
> > and the other to play. You then have the while loop which reads the
> > data out of the record and writes it to the play. This should
> > reproduce the microphone audio as output for you (the code above will
> > most likely put it out the speaker, play with the stream in the
> > AudioTrack constructor for earpiece).
>
> > You will need to run this code on a seperate thread and control the
> > lifetime of the thread using the isRecording boolean.
> > The first line elevates the thread to a higher priority, this may or
> > may not be correct, so you should play with it and see.
> > As for your delay, you may need to increase your buffer sizes to hold
> > a few seconds worth of data and then just write the data to the
> > AudioTrack later to create the delay.
>
> > Oh and watch for feedback if the sound does come out of the speaker as
> > it can be exponential if it's loud. You can always call:
>
> >        setVolumeControlStream(AudioManager.STREAM_MUSIC);
>
> > from your activity and just make sure you pass the same stream as the
> > one you pass to AudioTrack and your volume control will control the
> > volume of that stream, enabling you to turn it down ;-)
>
> > Hope that helps,
> > Mike
>
> > On Jan 21, 3:49 pm, Donal Rafferty <draf...@gmail.com> wrote:
> > > Really sorry to keep annoying you Micheal, head just doesn't seem to be
> > > functioning properly today.
>
> > > I currenlty have the AudiRecord buffer set up like this:
>
> > > static final int bufferSize = 80000;
> > > final short[] buffer = new short[bufferSize];
> > > short[] readBuffer = new short[bufferSize];
>
> > > File file = new File(Environment.getExternalStorageDirectory
> > >       ().getAbsolutePath() + "/record.pcm");
>
> > > OutputStream os = new FileOutputStream(file);
> > >  BufferedOutputStream bos = new BufferedOutputStream(os);
> > >  DataOutputStream dos = new DataOutputStream(bos);
>
> > > So that sets up to buffer to the file record.pcm and the
> > AudioRecord.read()
> > > methos is as follows:
>
> > >      int bufferReadResult = audioRecord.read(readBuffer, 0,bufferSize);
>
> > >                             for (int i = 0; i < bufferSize; i++)
> > >                                 buffer[i] = readBuffer[i];
> > >                             for (int i = 0; i < bufferReadResult; i++)
> > >                               dos.writeShort(buffer[i]);
>
> > > So it ends up reading to the file that way, so instead of the
> > OutputStream
> > > os being set
> > > to a FileOutputStream do I set it to something else? and then add the
> > > OutputStream to
> > > a BufferedOutputStream and then that to DaraOutPutStream?
>
> > > Or does buffer[i] hold exactly what I need and I just need to get whats
> > in
> > > buffer[i] to
> > > the AudioTrack?
>
> > > Thanks again and sorry to be so much hassle
>
> > > On Thu, Jan 21, 2010 at 3:19 PM, Michael <nicholls...@googlemail.com>
> > wrote:
> > > > Hi Donal,
>
> > > > Once you have constructed an AudioRecord instance you can call
> > > > startRecording and then you can use the various read methods to pull
> > > > the PCM data out.
> > > > Likewise once you have constructed an AudioTrack and called play you
> > > > can use one of the write methods to push the data you got from
> > > > AudioRecord into the play buffer.
>
> > > > Mike
>
> > > > On Jan 21, 3:12 pm, "draf...@gmail.com" <draf...@gmail.com> wrote:
> > > > > Hi Micheal,
>
> > > > > Thanks again,
>
> > > > > I now have it recording in PCM format from the mic and saving it to
> > > > > the sd card and then
> > > > > playing it back through the ear piece.
>
> > > > > So I just have to look into how to into piping the AudioRecord
> > > > > straight into the AuditTrack.
>
> > > > > So with the AudioRecord instead of creating a file to save to what
> > > > > should I look into doing?
>
> > > > > And with the AudioTrack, instead of looking for a file to read in
> > what
> > > > > should I look into doing?
>
> > > > > Thanks,
> > > > > Kind Regards,
> > > > > Donal
>
> > > > > On Jan 21, 1:10 pm, Michael <nicholls...@googlemail.com> wrote:
>
> > > > > > Hi Donal,
>
> > > > > > Yeah if you kick the record off and the play, then you can sit in a
> > > > > > loop reading the data out of Record and putting it into play (on a
> > > > > > thread other than the UI thread of course).
>
> > > > > > Not 100% sure about the earpiece, but you specify a stream when you
> > > > > > create the AudioTrack and I think a stream encpsulates audio
> > routing
> > > > > > and volume amongst possibly other things.
>
> > > > > > If you set the stream to STREAM_VOICE_CALL it might come through
> > the
> > > > > > earpiece as this is where a call would be routed, although I guess
> > > > > > that depends on headsets and stuff.
>
> > > > > > Can anyone clarify if I am right?
>
> > > > > > Mike
>
> > > > > > On Jan 21, 11:49 am, "draf...@gmail.com" <draf...@gmail.com>
> > wrote:
>
> > > > > > > Hi Mike,
>
> > > > > > > Thanks for the prompt reply.
>
> > > > > > > I was looking at the AudioRecord class but had somehow missed the
> > > > > > > AudioTrack class,
>
> > > > > > > thanks for pointing it out.
>
> > > > > > > From looking at the classes I think what I have to do is read the
> > > > > > > recording data and put it straight into a streamed
> > > > > > > AudioTrack, would I be correct in saying that?
>
> > > > > > > And then is it possible to send it to the earpiece?
>
> > > > > > > Thanks again,
>
> > > > > > > Donal
>
> > > > > > > On Jan 21, 11:36 am, Michael <nicholls...@googlemail.com> wrote:
>
> > > > > > > > AudioRecord and AudioTrack are the classes you need.
>
> > > > > > > > If you use them in streaming mode then you can pipe data out of
> > > > > > > > AudioRecord straight into AudioTrack and you should be able to
> > > > acheive
> > > > > > > > the desired effect.
>
> > > > > > > > I have done something similar, but without the delay.
>
> > > > > > > > Mike
>
> > > > > > > > On Jan 21, 11:28 am, "draf...@gmail.com" <draf...@gmail.com>
> > > > wrote:
>
> > > > > > > > > Hi all,
>
> > > > > > > > > I was wondering is it possible with Android to record from
> > the
> > > > mic and
> > > > > > > > > play the sound back out the earpiece with just a 1 second
> > delay?
>
> > > > > > > > > I have seen the tutorials and can currently record from the
> > mike
> > > > and
> > > > > > > > > save a 3gp file to the sd card.
>
> > > > > > > > > However is it posssible to record and say stream the audio
> > > > straight to
> > > > > > > > > the ear piece with just a 1 - 2 second delay?
>
> > > > > > > > > If so how would I go about doing this?
>
> > > > > > > > > Would I need to record from the mic and save it to a file and
> > > > then
> > > > > > > > > repaly to the ear piece? and continually do this?
>
> > > > > > > > > Or would it be possible to record from the mic and stream it
> > > > directly
> > > > > > > > > to the ear piece with just a slight delay?
>
> > > > > > > > > Any help, info or directions to tutorials would be greatly
> > > > > > > > > appreciated,
>
> > > > > > > > > Thanks in advance
>
> > > > --
> > > > You received this message because you are subscribed to the Google
> > > > Groups "Android Developers" group.
> > > > To post to this group, send email to
> > android-developers@googlegroups.com
> > > > To unsubscribe from this group, send email to
> > > > android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> > <android-developers%2bunsubscr...@googlegroups.com<android-developers%252bunsubscr...@googlegroups.com>
>
> > > > For more options, visit this group at
> > > >http://groups.google.com/group/android-developers?hl=en
>
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Android Developers" group.
> > To post to this group, send email to android-developers@googlegroups.com
> > To unsubscribe from this group, send email to
> > android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> > For more options, visit this group at
> >http://groups.google.com/group/android-developers?hl=en
-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to