2

I am stuck with an issue.

I am trying to do a live audio streaming from the device to the server.

The device is connected to the server over a socket. I have created a LocalServerSocket and setting the MediaRecorder.setOutputFile to this local socket.

However, when I try to do a MediaRecoder.start(), it throws an IllegalStateException. If the outputfile was a local file, it goes through successfully.

I have also interchanged the sender and receiver side of the local socket with the same result.

public class ChatClientV2 extends AsyncTask {

    private boolean _mInChatMode=false, _mStopChat = false;
    private Object syncObject= new Object();
    private int _mPort;
    private String _mServerAddress;

    private MediaRecorder _mMediaRecorder;
    private MediaPlayer _mMediaPlayer;

    private LocalServerSocket _mLocalServer;
    private LocalSocket _mLocalReceiver, _mLocalSender;

    //private MediaPlayer _mMediaPlayer;

    //  private AudioRecord _mRecorder;
//    private AudioTrack _mPlayer;
    //  private int _mBufferSize;

    //private ChatPlayBack _mChatPlayBack;
    private final  String LOCAL_SOCKET_NAME = "chatRecord";

    public ChatClientV2(String serverAddress, int serverPort, int sampleRate){

        _mServerAddress=serverAddress;
        _mPort=serverPort;

        _mMediaRecorder = new MediaRecorder();
        //_mChatPlayBack = new ChatPlayBack(sampleRate);
        executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,(Object)null);

    }

    public void startChat(){
        if (_mInChatMode)
            return;
        synchronized (syncObject) {
            _mStopChat=false;
            _mInChatMode=true;
            syncObject.notifyAll();
        }

        startRecording();
    }

    public void stopChat(){
        if (!_mInChatMode)
            return;
        synchronized (syncObject){
            _mInChatMode = false;
            syncObject.notifyAll();
        }
        pauseRecording();
    }

    public void endChat(){
        synchronized (syncObject){
            _mStopChat = true;
            syncObject.notifyAll();
        }
    }

    @Override
    protected Object doInBackground(Object[] objects) {

        Socket _mSocket = new Socket();
        try {
            _mSocket.connect(new InetSocketAddress(_mServerAddress, _mPort));
            //      _mChatPlayBack.startPlayBack(_mSocket);
            try {
                _mLocalServer = new LocalServerSocket(LOCAL_SOCKET_NAME);
                setUpRecorder();
                _mLocalSender=_mLocalServer.accept();

            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }

            byte tempBuffer[] = new byte[1024];
            while (!_mStopChat){

                int retval= _mLocalSender.getInputStream().read(tempBuffer);
                if (retval > 0 ){
                    _mSocket.getOutputStream().write(tempBuffer,0,retval);
                }

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private void setUpRecorder(){
        try
        {
            _mLocalReceiver = new LocalSocket(LocalSocket.SOCKET_STREAM);
            _mLocalReceiver.connect(new LocalSocketAddress(LOCAL_SOCKET_NAME));

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        Log.i("AudioRecord","------mRecorder configured--------");
    }

    private void startRecording(){
        _mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        _mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        _mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        _mMediaRecorder.setOutputFile(_mLocalReceiver.getFileDescriptor());
        try
        {
            _mMediaRecorder.prepare();
            _mMediaRecorder.start();
            Log.i("AudioRecord","------mRecorder.start()--------");
        }
        catch (IllegalStateException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void pauseRecording(){
        _mMediaRecorder.stop();
    }
}

The logcat is below

W/b202.card28.g28: type=1400 audit(0.0:122215): avc: denied { read write } for path="socket:[10736829]" dev="sockfs" ino=10736829 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c6,c257,c512,c768 tclass=unix_stream_socket permissive=0
E/MediaRecorder: start 0 m_rotation
E/MediaRecorder: start failed: -38
W/System.err: java.lang.IllegalStateException
W/System.err:     at android.media.MediaRecorder.native_start(Native Method)
W/System.err:     at android.media.MediaRecorder.start(MediaRecorder.java:1143)
W/System.err:     at in.b202.card28.Chat.ChatClientV2.startRecording(ChatClientV2.java:157)
W/System.err:     at in.b202.card28.Chat.ChatClientV2.startChat(ChatClientV2.java:61)
W/System.err:     at in.b202.card28.GamePlay.handleChat(GamePlay.java:862)
W/System.err:     at in.b202.card28.GamePlay.access$400(GamePlay.java:65)
W/System.err:     at in.b202.card28.GamePlay$6.onLongClick(GamePlay.java:849)

I have also tried with different formats and codecs. Any help on this will be appreciated.

  • any luck so far? I've hit same problem, but I believe that problem is not in codecs, but in socket usage... it might not work form main thread (like socket io), but I got little idea on how to solve it – Mike Dudnik Aug 14 '20 at 18:37
  • Were u able to find the solution @Rama Narayanaswamy – Chethan Shetty Mar 24 '21 at 13:55

0 Answers0