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.