Reputation: 417
I'm trying to stream audio rtp packets on my tablet using the android.net.rtp api. Before receiving packets, I want to test out the android.net.rtp.AudioGroup
Shouldnt the AudioGroup receive from the mic, play on the speaker? I am not concerned with it sending packets. I only want to test recording from mic and playback through the speaker functionality in the audiogroup.
In the MANIFEST I do have the permissions set to use Internet, Record_Audio, modify_audio_settings(for mode_in_communication)
The code is as follows. package rtp.stream;
import android.app.Activity;
import android.os.Bundle;
import android.media.AudioManager;
import android.net.rtp.*;
import android.util.Log;
import java.net.*;
public class Rtpstream3_2 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// AudioManager
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
// Initialize AudioStream and set codec
AudioStream inRtpStream = null;
try {
inRtpStream = new AudioStream(createInet(127, 0, 0, 1));
} catch (SocketException e) {
Log.d("Quit", "Socket Error");
System.exit(1);
}
inRtpStream.setMode(RtpStream.MODE_SEND_ONLY);
inRtpStream.setCodec(AudioCodec.PCMU);
inRtpStream.associate(createInet(10,2,0,165), 17222);
// Initialize an AudioGroup and attach an AudioStream
AudioGroup main_grp = new AudioGroup();
main_grp.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
inRtpStream.join(main_grp);
Log.d("Log"," Group joined"+inRtpStream.getLocalPort());
}
private InetAddress createInet(int b1, int b2, int b3, int b4) {
InetAddress addr = null;
try {
addr = InetAddress.getByAddress(new byte[] {(byte)b1, (byte)b2,
(byte)b4, (byte)b3
});
}
catch (UnknownHostException e) {
Log.d("Error", "Cannot create Inet address");
System.exit(1);
}
return addr;
}
}
When I run this on my tablet running version Android 3.2, I dont hear myself at all. I see a error message in logcat telling me that the AudioGroup is unable to read from the AudioRecord(mic). Right before this, I see a message from the AudioPolicyManager which says there is already in an input started. But there are no other application currently using the mic.
Anybody see something similar before? Any thoughts at all would be appreciated.
An excerpt from the log is below.
03-15 20:06:00.820: I/AudioService(286): AudioFocus requestAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls
03-15 20:06:00.820: D/AudioHardwareMot(6337): setMode(IN_COMMUNICATION)
03-15 20:06:00.820: D/AudioHardwareMot(6337): Putting streams to standby
03-15 20:06:00.820: D/AudioHardwareMot(6337): AudioStreamOutMot::standby called
03-15 20:06:00.820: D/AudioHardwareMot(6337): Input 0x849f8 entering standby
03-15 20:06:00.820: D/AcousticsModule(6337): Acoustics close stub called.
03-15 20:06:00.820: D/AudioHardwareMot(6337): setMode(): mode is MODE_IN_COMMUNICATION. Calling enableecns
03-15 20:06:00.820: D/AudioPostProcessor(6337): Reading ecns param file from /system/bin
03-15 20:06:00.820: D/AudioPostProcessor(6337): enableEcns() called: found param file. mEcnsEnabled value =0
03-15 20:06:00.820: D/AudioPostProcessor(6337): enableEcns(true)
03-15 20:06:00.820: **D/AudioHardwareInterface(6337): setMode(IN_COMMUNICATION)**
03-15 20:06:00.820: D/AudioHardwareMot(6337): setMode END
03-15 20:06:00.820: D/AudioHardwareMot(6337): Capture session will read from ECNS thread
03-15 20:06:00.820: D/AudioHardwareMot(6337): AudioStreamOutMot::setParameters() routing=8
**03-15 20:06:00.820: D/AudioHardwareMot(6337): Entering doALSAInputRouting
03-15 20:06:00.820: D/AudioHardwareMot(6337): Enter doALSAOutputRouting**
03-15 20:06:00.828: D/AudioHardwareMot(6337): Output gain set
03-15 20:06:00.828: D/AudioHardwareMot(6337): doRouting(): Calling mapaccy with accy 9, mNrec 1
03-15 20:06:00.828: D/AudioHardwareMot(6337): doRouting devs: stereo 0, mono 0, input 0. Chose speaker None (gain 0xb) mic None (gain 0x1c1c)
03-15 20:06:00.828: I/dalvikvm(7385): threadid=1: recursive native library load attempt (/system/lib/librtp_jni.so)
**03-15 20:06:00.835: D/AudioGroup(7385): stream[38] is configured as PCMU 8kHz 20ms mode 1
03-15 20:06:00.835: D/AudioGroup(7385): stream[42] is configured as RAW 8kHz 32ms mode 0
03-15 20:06:00.835: D/AudioGroup(7385): stream[42] joins group[41]
03-15 20:06:00.835: D/AudioGroup(7385): group[41] switches from mode 0 to 3
03-15 20:06:00.835: D/AudioGroup(7385): stream[38] joins group[41]**
03-15 20:06:00.835: D/Log(7385): Group joined55442
03-15 20:06:00.835: D/AudioHardwareMot(6337): Output latency, using cached value = 99
03-15 20:06:00.835: D/AudioGroup(7385): reported frame count: output 789, input 800
03-15 20:06:00.835: D/AudioGroup(7385): adjusted frame count: output 789, input 800
03-15 20:06:00.835: D/AudioHardwareMot(6337): Output latency, using cached value = 99
03-15 20:06:00.843: D/AudioHardwareMot(6337): Output latency, using cached value = 99
03-15 20:06:00.843: D/AudioHardwareMot(6337): AudioHardwareMot::openInputStream enter
03-15 20:06:00.843: D/AudioHardwareMot(6337): AudioStreamInMot::set(0xf9e8, 40000, 1, 10, 8000)
03-15 20:06:00.843: D/Omap4ALSA(6337): open called for devices 00040000 in mode 3...
03-15 20:06:00.851: I/gralloc(416): Unregistered ID: 10 handle: 0x92a7b0 size: 1280 x 800 fmt: 5 usage: 0x1300
03-15 20:06:00.851: D/Omap4ALSA(6337): setCodecDefaultControls
03-15 20:06:00.851: I/Omap4ALSA(6337): **Initialized ALSA CAPTURE device hw:0,1**
03-15 20:06:00.851: D/AcousticsModule(6337): Acoustics set_params stub called with 0.
03-15 20:06:00.851: D/AcousticsModule(6337): Acoustics close stub called.
03-15 20:06:00.851: I/gralloc(416): Unregistered ID: 9 handle: 0x94f0e8 size: 1280 x 800 fmt: 5 usage: 0x1300
03-15 20:06:00.851: D/AudioPostProcessor(6337): **Disabling beamformer due to unsupported sample rate**
03-15 20:06:00.851: D/AudioHardwareMot(6337): Input bufSize from ALSA = 352
03-15 20:06:00.851: D/AudioHardwareMot(6337): Output latency, using cached value = 99
03-15 20:06:00.859: D/AudioGroup(7385): latency: output 197, input 100
03-15 20:06:00.859: W/AudioPolicyManagerBase(6337): startInput() input 1559 failed: other input already started
03-15 20:06:00.882: E/AudioGroup(7385): **cannot read from AudioRecord**
03-15 20:06:00.902: W/AudioPolicyManagerBase(89): startInput() input 10711 failed: other input already started
Any pointers at all would be greatly appreciated.
Upvotes: 4
Views: 7104
Reputation: 81
I think you should set the speaker on!
Maybe you can use the following method:
audioManager.setSpeakerphoneOn(true);
Upvotes: 1
Reputation: 11
Did you swap the order of the byte[]
? It should be: new byte[] {b1, b2, b3, b4}
right?
I hope this helps. I'm trying to make an rtp client for android as well.
private InetAddress createInet(int b1, int b2, int b3, int b4) {
InetAddress addr = null;
try {
addr = InetAddress.getByAddress(new byte[] {(byte)b1, (byte)b2, (byte)b4, (byte)b3
});
}
Upvotes: 1