📄 xaudioplayer.pas
字号:
end
else
raise EXaudioException.Create('Cannot Load Xaudio DLL (' + LibraryPath + ')');
end;
{********************************************************************}
function TXaudioPlayer.CheckPlayerInstance: Boolean;
var
ApiVersion: Cardinal;
ApiMajor: Cardinal;
ApiMinor: Cardinal;
begin
{ Ensure that we have a player instance }
if (Player <> nil) then begin
CheckPlayerInstance := True;
Exit;
end;
{ Ensure DLL is loaded}
if (LibraryHandle = 0) then begin
LoadExternalInterface;
end;
if (LibraryHandle <> 0) then begin
{ check that the DLL we have has a compatible version }
ApiVersion := XaudioGetVersion(XA_VERSION_ID_ASYNC_API);
ApiMajor := (ApiVersion shr 16) and $FF;
ApiMinor := (ApiVersion shr 8) and $FF;
if (ApiMajor <> XA_ASYNC_API_MAJOR) or (ApiMinor <> XA_ASYNC_API_MINOR) then begin
Raise EXaudioException.Create('Xaudio DLL API Mismatch'#13'Expected ' +
IntToStr(XA_ASYNC_API_MAJOR) + '.' + IntToStr(XA_ASYNC_API_MINOR) +
', Got ' + IntToStr(ApiMajor) + '.' + IntToStr(ApiMinor));
CheckPlayerInstance := False;
Exit;
end;
{ Instantiate a native player object }
if (PlayerNew(Player, HiddenWindow) <> 0) then begin
Raise EXaudioException.Create('Cannot Start Xaudio Player');
Player := nil;
CheckPlayerInstance := False;
Exit;
end;
{ If the priority has been changed, set it now }
if (PlayerPriority <> XA_CONTROL_PRIORITY_HIGH) then
PlayerSetPriority(Player, PlayerPriority);
end
else begin
CheckPlayerInstance := False;
Exit;
end;
CheckPlayerInstance := True;
end;
{************************************************************}
function TXaudioPlayer.TranslateMessage(var msg_from: TMessage; var msg_to: XA_Message): Integer;
begin
if (Player <> nil) then
TranslateMessage := ControlWin32ParamsToMessage(Player, msg_to, msg_from.Msg, msg_from.WParam, msg_from.LParam)
else
TranslateMessage := -1;
end;
{************************************************************}
procedure TXaudioPlayer.OnWindowsMessage(var win32_msg: TMessage);
var
xa_msg: XA_Message;
begin
{ Default if this is not an Xaudio message }
if (win32_msg.Msg < XA_MSG_BASE) then
DefWindowProc(HiddenWindow, win32_msg.Msg, win32_msg.wParam, win32_msg.lParam);
{ Translate the Windows message into an Xaudio message }
if (TranslateMessage(win32_msg, xa_msg) <> 0) then Exit;
{ If there is a hook function, call it now }
if Assigned(FOnNotifyMessage) then
FOnNotifyMessage(self, xa_msg);
{ Dispatch the message to the registered event handler }
case xa_msg.code of
XA_MSG_NOTIFY_READY:
begin
if Assigned(FOnNotifyReady) then
FOnNotifyReady(self);
end;
XA_MSG_NOTIFY_ACK:
begin
if Assigned(FOnNotifyAck) then
FOnNotifyAck(self, xa_msg.ack);
end;
XA_MSG_NOTIFY_NACK:
begin
if Assigned(FOnNotifyNack) then
FOnNotifyNack(self, xa_msg.nack.command, xa_msg.nack.code);
end;
XA_MSG_NOTIFY_PONG:
begin
if Assigned(FOnNotifyPong) then
FOnNotifyPong(self, xa_msg.tag);
end;
XA_MSG_NOTIFY_EXITED:
begin
if Assigned(FOnNotifyExited) then
FOnNotifyExited(self);
end;
XA_MSG_NOTIFY_PLAYER_STATE:
begin
if Assigned(FOnNotifyPlayerState) then
FOnNotifyPlayerState(self, xa_msg.state);
end;
XA_MSG_NOTIFY_PLAYER_MODE:
begin
if Assigned(FOnNotifyPlayerMode) then
FOnNotifyPlayerMode(self, xa_msg.mode);
end;
XA_MSG_NOTIFY_PLAYER_ENVIRONMENT_INTEGER:
begin
if Assigned(FOnNotifyPlayerEnvironmentInteger) then
FOnNotifyPlayerEnvironmentInteger(self,
xa_msg.environment_info.name,
xa_msg.environment_info.integer_value);
end;
XA_MSG_NOTIFY_PLAYER_ENVIRONMENT_STRING:
begin
if Assigned(FOnNotifyPlayerEnvironmentString) then
FOnNotifyPlayerEnvironmentString(self,
xa_msg.environment_info.name,
xa_msg.environment_info.string_value);
end;
XA_MSG_NOTIFY_INPUT_STATE:
begin
if Assigned(FOnNotifyInputState) then
FOnNotifyInputState(self, xa_msg.state);
end;
XA_MSG_NOTIFY_INPUT_NAME:
begin
if Assigned(FOnNotifyInputName) then
FOnNotifyInputName(self, xa_msg.name);
end;
XA_MSG_NOTIFY_INPUT_CAPS:
begin
if Assigned(FOnNotifyInputCaps) then
FOnNotifyInputCaps(self, xa_msg.caps);
end;
XA_MSG_NOTIFY_INPUT_POSITION:
begin
if Assigned(FOnNotifyInputPosition) then
FOnNotifyInputPosition(self,
xa_msg.position.offset,
xa_msg.position.range);
end;
XA_MSG_NOTIFY_INPUT_POSITION_RANGE:
begin
if Assigned(FOnNotifyInputPositionRange) then
FOnNotifyInputPositionRange(self, xa_msg.range);
end;
XA_MSG_NOTIFY_INPUT_TIMECODE:
begin
if Assigned(FOnNotifyInputTimecode) then
FOnNotifyInputTimecode(self,
xa_msg.timecode.h,
xa_msg.timecode.m,
xa_msg.timecode.s,
xa_msg.timecode.f);
end;
XA_MSG_NOTIFY_INPUT_TIMECODE_GRANULARITY:
begin
if Assigned(FOnNotifyInputTimecodeGranularity) then
FOnNotifyInputTimecodeGranularity(self, xa_msg.granularity);
end;
XA_MSG_NOTIFY_INPUT_MODULE:
begin
if Assigned(FOnNotifyInputModule) then
FOnNotifyInputModule(self, xa_msg.module_id);
end;
XA_MSG_NOTIFY_INPUT_MODULE_INFO:
begin
if Assigned(FOnNotifyInputModuleInfo) then
FOnNotifyInputModuleInfo(self,
xa_msg.module_info.id,
xa_msg.module_info.nb_devices,
xa_msg.module_info.name,
xa_msg.module_info.description);
end;
XA_MSG_NOTIFY_INPUT_DEVICE_INFO:
begin
if Assigned(FOnNotifyInputDeviceInfo) then
FOnNotifyInputDeviceInfo(self,
xa_msg.device_info.module_id,
xa_msg.device_info.index,
xa_msg.device_info.flags,
xa_msg.device_info.name,
xa_msg.device_info.description);
end;
XA_MSG_NOTIFY_INPUT_FILTER_INFO:
begin
if Assigned(FOnNotifyInputFilterInfo) then
FOnNotifyInputFilterInfo(self,
xa_msg.filter_info.id,
xa_msg.filter_info.name);
end;
XA_MSG_NOTIFY_OUTPUT_STATE:
begin
if Assigned(FOnNotifyOutputState) then
FOnNotifyOutputState(self, xa_msg.state);
end;
XA_MSG_NOTIFY_OUTPUT_NAME:
begin
if Assigned(FOnNotifyOutputName) then
FOnNotifyOutputName(self, xa_msg.name);
end;
XA_MSG_NOTIFY_OUTPUT_CAPS:
begin
if Assigned(FOnNotifyOutputCaps) then
FOnNotifyOutputCaps(self, xa_msg.caps);
end;
XA_MSG_NOTIFY_OUTPUT_VOLUME:
begin
if Assigned(FOnNotifyOutputVolume) then
FOnNotifyOutputVolume(self,
xa_msg.volume.master_level,
xa_msg.volume.pcm_level,
xa_msg.volume.balance);
end;
XA_MSG_NOTIFY_OUTPUT_BALANCE:
begin
if Assigned(FOnNotifyOutputBalance) then
FOnNotifyOutputBalance(self, xa_msg.volume.balance);
end;
XA_MSG_NOTIFY_OUTPUT_PCM_LEVEL:
begin
if Assigned(FOnNotifyOutputPcmLevel) then
FOnNotifyOutputPcmLevel(self, xa_msg.volume.pcm_level);
end;
XA_MSG_NOTIFY_OUTPUT_MASTER_LEVEL:
begin
if Assigned(FOnNotifyOutputMasterLevel) then
FOnNotifyOutputMasterLevel(self, xa_msg.volume.master_level);
end;
XA_MSG_NOTIFY_OUTPUT_CHANNELS:
begin
if Assigned(FOnNotifyOutputChannels) then
FOnNotifyOutputChannels(self, xa_msg.channels);
end;
XA_MSG_NOTIFY_OUTPUT_PORTS:
begin
if Assigned(FOnNotifyOutputPorts) then
FOnNotifyOutputPorts(self, xa_msg.ports);
end;
XA_MSG_NOTIFY_OUTPUT_MODULE:
begin
if Assigned(FOnNotifyOutputModule) then
FOnNotifyOutputModule(self, xa_msg.module_id);
end;
XA_MSG_NOTIFY_OUTPUT_MODULE_INFO:
begin
if Assigned(FOnNotifyOutputModuleInfo) then
FOnNotifyOutputModuleInfo(self,
xa_msg.module_info.id,
xa_msg.module_info.nb_devices,
xa_msg.module_info.name,
xa_msg.module_info.description);
end;
XA_MSG_NOTIFY_OUTPUT_DEVICE_INFO:
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -