avid
avid

Reputation: 417

using android.net.rtp

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

Answers (2)

jane
jane

Reputation: 81

I think you should set the speaker on!

Maybe you can use the following method:

audioManager.setSpeakerphoneOn(true);

Upvotes: 1

Roberto Fonseca
Roberto Fonseca

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

Related Questions