能否让左右声道的两个音箱同时播放不同的声音?

lggxyxy 2004-03-26 10:38:51
能否让左右声道的两个音箱同时播放不同的声音?
...全文
290 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skynew2004 2004-09-20
  • 打赏
  • 举报
回复
换用DSPACK2.31吧,基于directshow9的控件,能控制左右声道。
http://www.progdigy.com/dspack/ 下载DSPACK2.31,
在安装之前要安装directx9。
shockjoy 2004-03-29
  • 打赏
  • 举报
回复
应该可以的
aiirii 2004-03-29
  • 打赏
  • 举报
回复
使用
procedure TForm1.FormCreate(Sender: TObject);
begin
Wave1.Play;
end;

var
Faza: Real=0;
procedure TForm1.Wave1Wave(Sender: TWave; var Buffer: TWaveArray);
var
I: Integer;
begin
for I:=$000 to $FFF do begin
Buffer[I].R:=Round($7FFF*Cos(Faza));
Buffer[I].L:=Round($7FFF*Sin(Faza));
Faza:=Faza+2*PI/44100*261.6; // nota C
end;
end;
aiirii 2004-03-29
  • 打赏
  • 举报
回复
這裹有個控件:
unit Wave;

interface

uses
Windows, Messages, SysUtils, Classes, Forms, MMSystem;

type
TWaveArray=array[0..$FFF] of packed record
R, L: SmallInt;
end;
TWave=class;
TWaveEvent=procedure(Sender: TWave; var Buffer: TWaveArray) of object;
TWave=class(TComponent)
private
FWindow: HWND;
FHandle: HWAVEOUT;
FIsPlaying: Boolean;
FWave: array[0..1] of record
IsFree: Boolean;
Hdr: TWaveHdr;
Buffer: TWaveArray;
end;
FOnWave: TWaveEvent;
procedure PlayWave(Index: Integer);
procedure FreeWave(Index: Integer);
procedure WndProc(var Msg: TMessage);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Play;
procedure Stop;
property Handle: HWAVEOUT read FHandle;
property IsPlaying: Boolean read FIsPlaying;
published
property OnWave: TWaveEvent read FOnWave write FOnWave;
end;

procedure Register;

implementation

// TWave - public:

constructor TWave.Create(AOwner: TComponent);
var
WF: TPCMWaveformat;
I: Integer;
begin
inherited;
FWindow:=AllocateHWnd(WndProc);
for I:=0 to 1 do FWave[I].IsFree:=True;
WF.wf.wFormatTag:=WAVE_FORMAT_PCM;
WF.wf.nChannels:=2;
WF.wf.nSamplesPerSec:=44100;
WF.wf.nAvgBytesPerSec:=176400;
WF.wf.nBlockAlign:=4;
WF.wBitsPerSample:=16;
if waveOutOpen(@FHandle, WAVE_MAPPER, @WF, FWindow, 0, CALLBACK_WINDOW)<>
MMSYSERR_NOERROR then FHandle:=0;
end;

destructor TWave.Destroy;
var
I: Integer;
begin
if Handle<>0 then begin
if IsPlaying then waveOutReset(Handle);
for I:=0 to 1 do FreeWave(I);
waveOutClose(Handle);
FHandle:=0;
end;
if FWindow<>0 then DeallocateHWnd(FWindow);
inherited;
end;

procedure TWave.Play;
var
I: Integer;
begin
if FIsPlaying then Exit;
for I:=0 to 1 do PlayWave(I);
end;

procedure TWave.Stop;
var
I: Integer;
begin
if not IsPlaying then Exit;
if IsPlaying then waveOutReset(Handle);
FIsPlaying:=False;
for I:=0 to 1 do FreeWave(I);
end;

// TWave - private:

procedure TWave.PlayWave(Index: Integer);
begin
if not FWave[Index].IsFree or not Assigned(OnWave) then Exit;
OnWave(Self, FWave[Index].Buffer);
FWave[Index].Hdr.lpData:=@FWave[Index].Buffer;
FWave[Index].Hdr.dwBufferLength:=SizeOf(TWaveArray);
FWave[Index].Hdr.dwUser:=0;
FWave[Index].Hdr.dwFlags:=0;
FWave[Index].Hdr.dwLoops:=0;
if waveOutPrepareHeader(FHandle, @FWave[Index].Hdr, SizeOf(TWAVEHDR))=MMSYSERR_NOERROR
then
if waveOutWrite(FHandle, @FWave[Index].Hdr, SizeOf(TWAVEHDR))<>MMSYSERR_NOERROR
then
waveOutUnprepareHeader(FHandle, @FWave[Index].Hdr, SizeOf(TWaveHdr))
else begin
FWave[Index].IsFree:=False;
FIsPlaying:=True;
end;
end;

procedure TWave.FreeWave(Index: Integer);
begin
if FWave[Index].IsFree then Exit;
if waveOutUnprepareHeader(FHandle, @FWave[Index].Hdr, SizeOf(TWaveHdr))=
MMSYSERR_NOERROR then FWave[Index].IsFree:=True;
end;

procedure TWave.WndProc(var Msg: TMessage);
var
I: Integer;
begin
if Msg.Msg<>MM_WOM_DONE then begin
Msg.Result:=DefWindowProc(FWindow, Msg.Msg, Msg.wParam, Msg.lParam);
Exit;
end;
if not IsPlaying then Exit;
for I:=0 to 1 do
if Integer(@FWave[I].Hdr)=Msg.LParam then begin
FreeWave(I);
PlayWave(I);
end;
end;

procedure Register;
begin
RegisterComponents('Test', [TWave]);
end;

end.
zblaoshu1979 2004-03-29
  • 打赏
  • 举报
回复
up
HuterTT 2004-03-27
  • 打赏
  • 举报
回复
UP
sxy_9761 2004-03-27
  • 打赏
  • 举报
回复
关注
aaalouis 2004-03-27
  • 打赏
  • 举报
回复
//转贴声道的

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, mmsystem, StdCtrls, MPlayer;

type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
TrackBar4: TTrackBar;
Button: TButton;
MediaPlayer: TMediaPlayer;
OpenDialog: TOpenDialog;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TrackBar4Change(Sender: TObject);
procedure ButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ID:word;

implementation

{$R *.DFM}

procedure TForm1.TrackBar1Change(Sender: TObject);
var
t,v:Longint;
begin
// if a=0 then Exit;
t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
waveOutSetVolume(ID,v);
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
var
t,v:Longint;
begin
t:=TrackBar2.Position;
waveOutGetVolume(ID,@v);
v:=v and $ffff0000 or (t shl 8);
waveOutSetVolume(ID,v);
end;

procedure TForm1.TrackBar3Change(Sender: TObject);
var
t,v:Longint;
begin
t:=TrackBar3.Position;
waveOutGetVolume(ID,@v);
v:=v and $0000ffff or (t shl 24);
waveOutSetVolume(ID,v);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
v:longint;
begin
waveOutGetVolume(ID,@v);
TrackBar2.Position:=hi(v);
TrackBar3.Position:=hi(v shr 16);
if hi(v)>hi(v shr 16) then
TrackBar1.Position:=hi(v)
else
TrackBar1.Position:=hi(v shr 16);

auxGetVolume(ID,@v);
if hi(v)>hi(v shr 16) then
TrackBar4.Position:=hi(v)
else
TrackBar4.Position:=hi(v shr 16);
end;

procedure TForm1.TrackBar4Change(Sender: TObject);
var
t,v:Longint;
begin
// if a=0 then Exit;
t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
auxSetVolume(0,v);

//auxSetVolume
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
MediaPlayer.FileName:=OpenDialog.FileName;
MediaPlayer.Open;
ID:=MediaPlayer.DeviceID;
end;

end;

end.
aiirii 2004-03-27
  • 打赏
  • 举报
回复
參與!!
alanyanyi 2004-03-27
  • 打赏
  • 举报
回复
你应该用软件实现,就是说,用你编的软件,实现“打开两个声音文件,然后,将两个文件合成为一个,分为左右声道”,这样,就实现了。应该不难吧。
surdon 2004-03-26
  • 打赏
  • 举报
回复
有意思 哈 没试过
lijunisbug 2004-03-26
  • 打赏
  • 举报
回复
directx 9.0支持

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧