Hello
I am trying to use Opus in Bass
more precisely:
i am trying to get sound from the microphone I'm doing it:
//Client
var
Form3: TForm3;
BLoaded: boolean;
chanPlay, ChanMic: Dword;
EncodeChan: HENCODE;
avail, freq: word;
playchan:HSTREAM;
buffer: TIDBytes;
BASSProcs: BASS_FILEPROCS;
isrecording : Boolean;
writestream:TmemoryStream;
................
procedure TForm3.FormCreate(Sender: TObject);
begin
UDP_Rec := TIdUDPClient.Create;
with UDP_Rec do begin
BufferSize:=3000;
Port := 5000;
BroadcastEnabled:=true;
Active:=true;
end;
freq:=44100; //Частота дискретизации
setlength(buffer,UDP_Rec.BufferSize);
BLoaded:=BASS_Init(-1, 44100, 0, 0, nil);
if BLoaded then
begin
BASS_RecordInit(-1);
end;
BASS_SetConfig(BASS_CONFIG_NET_PLAYLIST, 1); // enable playlist processing
BASS_SetConfig(BASS_CONFIG_NET_PREBUF, 0); // minimize automatic pre-buffering, so we can do it (and display it) instead
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
isrecording := True;
writeStream:=TmemoryStream.create;
chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil);
VoiceThread:=TVoiceThread.Create(True);
VoiceThread.UDP_Rec := UDP_Rec;
VoiceThread.Start;
end;
procedure TVoiceThread.Execute;
begin
inherited;
while isrecording do begin
try
avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE);
if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем
try
BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize);
// UDP_Rec.Broadcast(Buffer, 5000);
UDP_Rec.SendBuffer('127.0.0.1', 5000, buffer);
except
end;
end;
finally
sleep(20);
end;
end;
BASS_ChannelStop(chanmic);
BASS_StreamFree(chanmic);
end;
//Server
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Radio.Bass, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, FMX.Controls.Presentation, FMX.StdCtrls,
IdUDPServer, IdGlobal, IdSocketHandle;
type
TForm4 = class(TForm)
Button1: TButton;
UDP_Rec: TIdUDPServer;
IdUDPClient1: TIdUDPClient;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
chanPlay: HSTREAM;
procedure UDP_RecUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.fmx}
procedure TForm4.FormCreate(Sender: TObject);
begin
BASS_Init(-1, 44100, 0, 0, nil);
end;
procedure TForm4.Button1Click(Sender: TObject);
begin
chanPlay:= BASS_StreamCreate(44100, 1, 0, STREAMPROC_PUSH, nil);
// IdUDPClient1.
UDP_Rec.OnUDPRead:=UDP_RecUDPRead;
BASS_ChannelPlay(chanPlay, false);
end;
procedure TForm4.UDP_RecUDPRead(AThread: TIdUDPListenerThread; const AData:
TIdBytes; ABinding: TIdSocketHandle);
begin
try
BASS_StreamPutData(chanPlay, AData,length(AData))
except
end;
end;
everything works well here
how can I use Opus here? can anyone help
i tried to do the following:
added in code:
procedure EncodeCallback(handle:HENCODE; channel:DWORD; buffer:Pointer; length:DWORD; user:Pointer) stdcall;
begin
end;
Function Bass_Read(buffer: Pointer; length: DWORD; user: Pointer): DWORD; stdcall;
begin
End;
Procedure Bass_Close(user: Pointer); stdcall;
Begin
End;
Function Bass_Length(user: Pointer): QWORD; stdcall;
Begin
End;
function Bass_Seek(offset: QWORD; user: Pointer): BOOL stdcall;
Begin
End;
...............................
EncodeChan:=BASS_Encode_OPUS_Start(chanMic, '--bitrate 80 --cvbr', BASS_ENCODE_AUTOFREE or BASS_UNICODE, @EncodeCallback, nil);
BASS_ChannelPlay(EncodeChan, false);
BASSProcs.close := Bass_Close;
BASSProcs.length := Bass_Length;
BASSProcs.read := Bass_Read;
BASSProcs.seek := Bass_Seek;
playchan:=BASS_OPUS_StreamCreateFileUser(STREAMFILE_BUFFERPUSH, BASS_STREAM_AUTOFREE or BASS_UNICODE, BASSProcs, nil);
BASS_ChannelPlay(playChan, false);
but i can't figure out how to get the data?
if anyone has experience please share
Thank you in advance