? 在用ACMwave控件时遇到的pChar、String、pointer之间的问题,请帮忙看看(100分)

  • 主题发起人 主题发起人 ASDC
  • 开始时间 开始时间
A

ASDC

Unregistered / Unconfirmed
GUEST, unregistred user!
//开始
procedure TForm1.ACMWaveIn1Data(data: Pointer; size: Integer);
var strData:string;
st:TStrings;
pchData,aa:pChar;
myStream:TMemoryStream;
begin
pchData:=pchar(data);//将data赋值给pchData
ACMWaveOut1.PlayBack(pchData,Size);//播放正常,说明pchData已经取得了data的指。

end;

//修改后
procedure TForm1.ACMWaveIn1Data(data: Pointer; size: Integer);
var strData:string;
pchData,pchTest:pChar;
i:integer;
begin
pchData:=pchar(data);
//下面就是我的语句,我是想将data的数据转换成String,
//然后加上一些标识字符,再转换成TmeoryStream,通过NMUDP发送到另外的计算机,
//其他计算机收到后再playback
strData:=strpas(pchData);
pchTest:=pChar(strData);
i:=strData; //这个i的值经常和size不相等,当然也有相等的时候。
ACMWaveOut1.PlayBack(pchTest,Size); //这句经常执行错误,但有时也能听到一点声音
end;

还有就是各位大富翁在做这个问题的时候的处理办法,我是想做一个玩魔兽时能相互聊天的小工具,能分组,小组内是广播信号,在这里遇到麻烦了。
 
string在DELHPI中是自管理的,如果你要将一个PCHAR赋值给一个string,那你要先调用
SetLength(string, 长度),然后才可以。
如果你想最后添加一些表示,然后再传给TMemoryStream,不妨用Buf: array of char;
或者Buf: array of Byte来操作数据,这样效率高一些,而且便捷。
 
广播?遇到什么麻烦了?
 
qince 说的对,用指定长度的,不然Delphi不知道要分配多大的内存。
 
procedure TForm1.ACMWaveIn1Data(data: Pointer; size: Integer);
var strData:string;
pchData,pchTest:pChar;
i:integer;
begin
pchData:=pchar(data);
//下面就是我的语句,我是想将data的数据转换成String,
//然后加上一些标识字符,再转换成TmeoryStream,通过NMUDP发送到另外的计算机,
//其他计算机收到后再playback
SetLength(strData,Size);
Move(Data^, strData[1], Size); //注意^符号
// strData:=strpas(pchData);
pchTest:=pChar(strData);
i:=strData; //这个i的值经常和size不相等,当然也有相等的时候。
ACMWaveOut1.PlayBack(pchTest,Size); //这句经常执行错误,但有时也能听到一点声音
end;
 
i:=strData; //这个i的值经常和size不相等,当然也有相等的时候。

这里怎么可以呢? 是不是i := Length(strData)?
 
首先谢谢各位的帮助!
to qince:就是比如一台计算机同时收到其他几台发来的数据,这些都加入ACMWaveOut1.playback后,会出现较大延迟,而且是越来越厉害,我感觉这个playback是将输入的数据添加放到一个缓冲区,其实它播放的顺序还是按照原来的顺序,所以如果同时收到5台机发来的数据,就是每台机一秒,那么这些数据将播放5秒钟,延时就这样产生了,我想看是否能将同时收到的数据进行混和,5台机发来的数据还是混成1秒的数据,这样产生的延时还能接受。
to jackchin:这个错误确实是不可饶恕的
to tseug:
SetLength(strData,Size);
Move(Data^, strData[1], Size); //注意^符号
这种方法学会了,谢谢!


昨晚我改成下面这样后,已经可以操作,只是办法有点笨。
procedure TForm1.ACMWaveIn1Data(data: Pointer; size: Integer);
var strData:string;
pchData,pchTest,a:pChar;
i:integer;
myStream,Stream2:TMemoryStream;
begin
setlength(strData,size);
myStream:=TMemoryStream.Create;
Stream2:=TMemoryStream.Create;
try
pchData:=pchar(data);
myStream.Write(pchData^,size);
Stream2.LoadFromStream(myStream);
Stream2.read(strData[1],size);
CurWaveLsh:=CurWaveLsh+1;
if (CurWaveLsh>999) then CurWaveLsh:=1;
SendMyWave(strData,'1',inttostr(CurWaveLsh));
finally
myStream.Free;
Stream2.free;
end;
end;
 
[:)]没用过ACM控件,如果你不想作每个客户端的混音,可以用一个Buf结构,每次客户端发送数据都追加给BUF中,只用将BUF送给ACM播放就可以了。
 
现在就是这样的
但ACM控件的播放就是按你添加进去的流进行顺序播放,有点象winamp播放歌曲似的,
就算你现在正在播放一首歌,你又添加一首歌进去后,他还是要把原先的那首播完再播你后加的这首,如果队列里原本就有很多了,那就等得更久。

所以想找个混音的东西,不管算法还是控件。
 
后退
顶部