.xm and .s3m file doesn't play in BASS library from Inno Setup, only .mp3

人盡茶涼 提交于 2019-12-19 11:42:53

问题


When I choose .mp3 file, it will play when launching setup.exe but when I change it to .xm or .s3m, it doesn't play

[Setup]
AppName=Bass Audio Project
AppVersion=1.0
DefaultDirName={pf}\Bass Audio Project

[Files]
Source: "Bass.dll"; Flags: dontcopy
Source: "tune.xm"; Flags: dontcopy

[CustomMessages]
SoundCtrlButtonCaptionSoundOn=Play
SoundCtrlButtonCaptionSoundOff=Mute

[Code]
const  
  BASS_SAMPLE_LOOP = 4;
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PLAYING = 1;
  BASS_ACTIVE_STALLED = 2;
  BASS_ACTIVE_PAUSED  = 3;
  BASS_UNICODE = $80000000;
  BASS_CONFIG_GVOL_STREAM = 5;
const
  #ifndef UNICODE
    EncodingFlag = 0;
  #else
    EncodingFlag = BASS_UNICODE;
  #endif
type
  HSTREAM = DWORD;

function BASS_Init(device: LongInt; freq, flags: DWORD; 
  win: HWND; clsid: Cardinal): BOOL;
  external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: string; offset1: DWORD; 
  offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_Start: BOOL;
  external 'BASS_Start@files:bass.dll stdcall';
function BASS_Pause: BOOL;
  external 'BASS_Pause@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; 
  external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): BOOL;
  external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_ChannelIsActive(handle: DWORD): DWORD;
  external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_Free: BOOL;
  external 'BASS_Free@files:bass.dll stdcall';

var
  SoundStream: HSTREAM;
  SoundCtrlButton: TNewButton;
  Muted: Boolean;

procedure SoundCtrlButtonClick(Sender: TObject);
begin
  if not Muted then
  begin
    if BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 0) then
    begin
      SoundCtrlButton.Caption := 'Play'; 
      Muted := True;
    end;
  end
    else
  begin
    if BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500) then
    begin
      SoundCtrlButton.Caption := 'Mute'; 
      Muted := False;
    end;
  end;
end;

procedure InitializeWizard;
begin
  ExtractTemporaryFile('tune.xm');
  if BASS_Init(-1, 44100, 0, 0, 0) then
  begin
    SoundStream := BASS_StreamCreateFile(False, 
      ExpandConstant('{tmp}\tune.xm'), 0, 0, 0, 0, 
      EncodingFlag or BASS_SAMPLE_LOOP);
    BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
    BASS_ChannelPlay(SoundStream, False);

    SoundCtrlButton := TNewButton.Create(WizardForm);
    SoundCtrlButton.Parent := WizardForm;
    SoundCtrlButton.Left := 8;
    SoundCtrlButton.Top := WizardForm.ClientHeight - 
      SoundCtrlButton.Height - 8;
    SoundCtrlButton.Width := 40;
    SoundCtrlButton.Caption :=
      ExpandConstant('{cm:SoundCtrlButtonCaptionSoundOff}');
    SoundCtrlButton.OnClick := @SoundCtrlButtonClick;
  end;
end;

procedure DeinitializeSetup;
begin
  BASS_Free;
end;

What should I do? I want to use to original file which is .xm or .s3m and not the converted one which is .mp3.

As seen on Un4seen, bass.dll supports .xm and .s3m.


回答1:


Indeed, the BASS_StreamCreateFile returns 0 for both files.

And if you call BASS_ErrorGetCode afterwards, it returns 41 = BASS_ERROR_FILEFORM (unsupported file format).

function BASS_ErrorGetCode(): Integer;
  external 'BASS_ErrorGetCode@files:bass.dll stdcall';
SoundStream := BASS_StreamCreateFile(...);
if SoundStream = 0 then
begin
  Log(Format('Error playing file, error code = %d', [BASS_ErrorGetCode]));
end;

But as you correctly hinted, you should use the BASS_MusicLoad for MO3 / IT / XM / S3M / MTM / MOD / UMX formats.

type
  HMUSIC = DWORD;

function BASS_MusicLoad(
    mem: BOOL; f: string; offset: Int64; length, flags, freq: DWORD): HMUSIC;
    external 'BASS_MusicLoad@files:bass.dll stdcall';

Replace the BASS_StreamCreateFile call with:

BASS_MusicLoad(
  False, ExpandConstant('{tmp}\tune.xm'), 0, 0,   
  EncodingFlag or BASS_SAMPLE_LOOP, 0)

Semantically, your should also rename the SoundStream variable to Music or similar; and change its type to HMUSIC.



来源:https://stackoverflow.com/questions/40472629/xm-and-s3m-file-doesnt-play-in-bass-library-from-inno-setup-only-mp3

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!