//audio recorder
GBUFFSIZE := TJAudioRecord.JavaClass.getMinBufferSize(8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT);
Gstream := TJavaArray<Byte>.Create(GBUFFSIZE);
AudioRecorder:= TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.VOICE_COMMUNICATION,
8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
GBUFFSIZE);
//start recording
(AudioRecorder as JAudioRecord).startRecording;
papulaterecorder.Enabled := True;
//timer
procedure TForm1.papulaterecorderTimer(Sender: TObject);
var
index: Integer;
NewCount: Integer;
Bytes: TIdBytes;
begin
// Read from the AudioRecover
NewCount:= (AudioRecorder as JAudioRecord).read(Gstream, 0, GBUFFSIZE);
if (NewCount > 0) then
begin
Bytes := RawToBytes(Gstream.Data^, NewCount);
SendBuffer(Bytes, NewCount);
end;
end;
end;
procedure SendBuffer(Buffer: TIdBytes; BufferSize: Cardinal);
Var
Strm: TIdMemoryBufferStream;
begin
Strm := TIdMemoryBufferStream.Create(PByte(Buffer), BufferSize);
try
FTCP.Socket.WriteLn('stream');
FTCP.Socket.LargeStream := True;
FTCP.Socket.Write(Strm, 0, True);
finally
Strm.Free;
end;
end;
var
Bytes: TIdBytes;
..
Bytes := RawToBytes(Gstream.Data^, NewCount);
SendBuffer(Bytes, NewCount);
procedure SendBuffer(Buffer: TIdBytes; BufferSize: Cardinal);
Var
Strm: TIdMemoryBufferStream;
begin
Strm := TIdMemoryBufferStream.Create(PByte(Buffer), BufferSize);
try
FTCP.Socket.WriteLn('stream');
FTCP.Socket.LargeStream := True;
FTCP.Socket.Write(Strm, 0, True);
finally
Strm.Free;
end;
end;
procedure Tform1.recorderData(Sender: TObject; const Buffer: Pointer; BufferSize: Cardinal; var FreeIt: Boolean);
var
Bytes: TIdBytes;
begin
FreeIt := True;
if (Buffer <> nil) and (BufferSize > 0) then
begin
try
Bytes := RawToBytes(Buffer^, BufferSize);
except
exit;
end;
begin
SendBuffer(Bytes, BufferSize);
end;
end;
end;
procedure TForm1.timer1Timer(Sender: TObject);
var
NewCount: Integer;
begin
NewCount:= (AudioRecorder as JAudioRecord).read(Gstream, 0, GBUFFSIZE);
if NewCount > 0 then
begin
try
ClientThread.SendBuffer(Gstream.Data, Gstream.Length);
except
end;
end;
end;
SendBuffer(Buffer: pointer; BufferSize: Cardinal);
Var
Strm: TIdMemoryBufferStream;
begin
ClientThread.Lock;
try
Strm := TIdMemoryBufferStream.Create(Buffer, BufferSize);
try
FTCP.Socket.WriteLn('Stream');
FTCP.Socket.LargeStream := True;
FTCP.Socket.Write(Strm, 0, True);
finally
Strm.Free;
end;
finally
ClientThread.Unlock;
end;
end;
procedure SendBuffer(Buffer: TIdBytes; BufferSize: Cardinal);
Var
Strm: TIdMemoryBufferStream;
begin
Strm := TIdMemoryBufferStream.Create(PByte(Buffer), BufferSize);
try
FTCP.IOHandler.WriteLn('stream');
FTCP.IOHandler.LargeStream := True;
FTCP.IOHandler.Write(Strm, 0, True);
finally
Strm.Free;
end;
end;
procedure TForm1.timer1Timer(Sender: TObject);
var
NewCount: Integer;
begin
NewCount:= (AudioRecorder as JAudioRecord).read(Gstream, 0, GBUFFSIZE);
if NewCount > 0 then
begin
try
ClientThread.SendBuffer(Gstream.Data, Gstream.Length);
except
end;
end;
end;
SendBuffer(Buffer: pointer; BufferSize: Cardinal);
Var
Strm: TIdMemoryBufferStream;
begin
ClientThread.Lock;
try
Strm := TIdMemoryBufferStream.Create(Buffer, BufferSize);
try
FTCP.Socket.WriteLn('Stream');
FTCP.Socket.LargeStream := True;
FTCP.Socket.Write(Strm, 0, True);
finally
Strm.Free;
end;
finally
ClientThread.Unlock;
end;
end;
...
GBUFFSIZE := TJAudioRecord.JavaClass.getMinBufferSize(8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT);
Gstream := TJavaArray<Byte>.Create(GBUFFSIZE * 10);
AudioRecorder:= TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.VOICE_COMMUNICATION,
8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
GBUFFSIZE * 10);
...
procedure TForm1.timer1Timer(Sender: TObject);
var
NewCount: Integer;
begin
timer1.Enable := False;
try
//check for enough data....
NewCount:= (AudioRecorder as JAudioRecord).read(Gstream, 0, GBUFFSIZE * 10, 0);
{
[i]readMode int: one of READ_BLOCKING = 0, READ_NON_BLOCKING = 1.
With READ_BLOCKING, the read will block until all the requested data is read.
With READ_NON_BLOCKING, the read will return immediately after reading as much audio data as possible without blocking.[/i]
}
if NewCount > 0 then
begin
....
finally
timer1.Enable := True;
end;
end; //timer1Timer
...
procedure TForm1.timer1Timer(Sender: TObject);
var
NewCount: Integer;
begin
Timer1.Enabled := False;
try
NewCount := 0;
NewCount:= (AudioRecorder as JAudioRecord).read(Micstream, 0, MICBUFFSIZE * 10);
if NewCount > 0 then
begin
ClientThread.SendBuffer(Micstream.Data, NewCount);
end;
finally
Timer1.Enabled := True;
end;
end;
MICBUFFSIZE := TJAudioRecord.JavaClass.getMinBufferSize(8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT);
Micstream := TJavaArray<Byte>.Create(MICBUFFSIZE * 10);
AudioRecorder:= TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.VOICE_COMMUNICATION,
8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
MICBUFFSIZE * 10);
type
TAudiocallbackproc = procedure (Sender: TObject; Sbuffer:pointer; SBufferSize: Cardinal) of object;
TAudioStreamThread = class(TThread)
private
FonAudiocallbackproc : TAudiocallbackproc;
FCs: TCriticalSection;
Fbuffer : pointer;
FBufferSize : Cardinal;
//recorder
AudioRecorder: JAudioRecord;
MICBUFFSIZE: Integer;
Micstream : TJavaArray<Byte>;
procedure DoAudiocallbackproc;
//
protected
procedure Execute; override;
Public
constructor Create(CreateSuspended: Boolean; AonAudiocallbackproc: TAudiocallbackproc); reintroduce;
destructor Destroy; override;
end;
{ TAudioStreamThread }
constructor TAudioStreamThread.Create(CreateSuspended: Boolean;
AonAudiocallbackproc: TAudiocallbackproc);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
FCs := TCriticalSection.Create;
FonAudiocallbackproc := AonAudiocallbackproc;
end;
destructor TAudioStreamThread.Destroy;
begin
FreeAndNil(FCs);
inherited;
end;
procedure TAudioStreamThread.DoAudiocallbackproc;
begin
if Assigned(FonAudiocallbackproc) then
begin
FonAudiocallbackproc(self, Fbuffer, FBufferSize);
end;
end;
procedure TAudioStreamThread.Execute;
var
NewCount : integer;
begin
// microphone
MICBUFFSIZE := TJAudioRecord.JavaClass.getMinBufferSize(8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT);
Micstream := TJavaArray<Byte>.Create(MICBUFFSIZE);
AudioRecorder:= TJAudioRecord.JavaClass.init(TJMediaRecorder_AudioSource.JavaClass.VOICE_COMMUNICATION,
8000,
TJAudioFormat.JavaClass.CHANNEL_IN_MONO,
TJAudioFormat.JavaClass.ENCODING_PCM_16BIT,
MICBUFFSIZE);
(AudioRecorder as JAudioRecord).startRecording;
NewCount := 0;
while not terminated do
begin
NewCount:= (AudioRecorder as JAudioRecord).read(Micstream, 0, MICBUFFSIZE);
if NewCount > 0 then
begin
Fbuffer := Micstream.Data;
FBufferSize := Micstream.Length;
CThread.SendBuffer(Fbuffer, FBufferSize);
end;
end;
end;
procedure TCThread.SendBuffer(Buffer: pointer; BufferSize: Cardinal);
Var
Strm: TIdMemoryBufferStream;
begin
crit.Lock;
try
if not FTCP.Connected then
begin
exit;
end;
Strm := TIdMemoryBufferStream.Create(Buffer, BufferSize);
try
FTCP.Socket.WriteLn('Stream');
FTCP.Socket.LargeStream := True;
FTCP.Socket.Write(Strm, 0, True);
finally
Strm.Free;
end;
finally
crit.Unlock;
end;
end;
Then again ... it is better to use separate thread to send data....