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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
> 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, "[email protected]" <[email protected]> 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 <[email protected]> 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, "[email protected]" <[email protected]>
> 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 <[email protected]> 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, "[email protected]" <[email protected]>
> > > 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
> [email protected]
> > > To unsubscribe from this group, send email to
> > > [email protected]<android-developers%[email protected]>
> <android-developers%[email protected]<android-developers%[email protected]>
> >
> > > 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 [email protected]
> To unsubscribe from this group, send email to
> [email protected]<android-developers%[email protected]>
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to