Hi Micheal,
do you fancy helping me try to solve the ear piece problem to make it
two pints? :-)
It initially sounds like it gets routed to the ear piece on the HTC
Hero but thats because of the way the earpiece and speaker are set up
on the hero, on a G1 it is clearly coming through the speaker.
here is the full code I have:
boolean isRecording; //currently not used
AudioManager am;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
Record record = new Record();
record.run();
}
public class Record extends Thread
{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
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_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
am.setRouting(AudioManager.MODE_NORMAL,
AudioManager.ROUTE_EARPIECE,
AudioManager.ROUTE_ALL);
Log.d("SPEAKERPHONE", "Is speakerphone
on? : " + am.isSpeakerphoneOn());
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0,
buffersize);
atrack.write(buffer, 0,
buffer.length);
}
arec.stop();
atrack.stop();
isRecording = false;
}
}
}
The log message shows that isSpeakerPhoneOn returns false yet the
audio still comes through the speaker,
The setRouting method is deprecated and doesnt work either and no
matter what stream I choose in the AudioTrack
constructor the audio gets played out over the Speaker.
Cant find much on it with a search either, just people having the same
problems as me.
Would you or anyone have any insight on how to get it to play through
the ear piece?
Thanks again in advance,
Donal
On Jan 21, 5:29 pm, Michael <[email protected]> wrote:
> 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 <[email protected]> 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 <[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
>
> ...
>
> read more »
--
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