Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi BASS_StreamCreateFile: Access violation (https://www.delphipraxis.net/112395-bass_streamcreatefile-access-violation.html)

64Jabor 20. Apr 2008 12:08


BASS_StreamCreateFile: Access violation
 
Hallo DP,

DIESER
Delphi-Quellcode:
BASS_channelstop(Channel);
Channel := BASS_StreamCreateFile(FALSE, PChar(PlayList.strings[SongNumber]), 0, 0, 0);
BASS_ChannelPlay(Channel, False);
Code bereitet mir jedesmal einen AccessViolation!
Ich nutze hier die BASS.dll, habe sie im FormCreate mit
Delphi-Quellcode:
BASS_Init(-1, 44100, 0, Application.Handle, nil);
initialisiert, und versuche per Timer aus dem spielenden Channel die FFTData zu nutzen.
Aber an der Stelle BASS_StreamCreateFile... bekomme ich immer den Access violation mit Assembler-Code...

Ideen?

mfg Sebi

EWeiss 20. Apr 2008 12:20

Re: BASS_StreamCreateFile: Access violation
 
Was sagt denn die Definition von BASS_StreamCreateFile ?
Welche parameter werden da übergeben.

gruss Emil

NikoMitDaMacht 20. Apr 2008 13:35

Re: BASS_StreamCreateFile: Access violation
 
Ich glaube du musst den Channel erst freigeben, bevor du einen neuen Lädst.

64Jabor 20. Apr 2008 13:45

Re: BASS_StreamCreateFile: Access violation
 
@emil

Delphi-Quellcode:
function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length: QWORD; flags: DWORD): HSTREAM; stdcall; external bassdll;
So sieht die function BASS_StreamCreateFile in der "bass.pas" aus,
wobei ich DAS
Zitat:

mem - TRUE = stream the file from memory.
file - Filename (mem = FALSE) or a memory location (mem = TRUE).
offset - File offset to begin streaming from (only used if mem = FALSE).
length - Data length... 0 = use all data up to the end of the file (if mem = FALSE).
flags - Any combination of these flags.
in der "Hilfe" gefunden habe!
Aber vielleicht liegt es ja auch gar nicht an StreamCreateFile denn es ist ja öfter so dass IDEs den Fehler in der nächsten, und somit falschen, Zeile anzeigen...

@nico
Hmm, ok, das werde ich mal veruschen, geht wahrscheinlich per
Delphi-Quellcode:
BASS_StreamFree(...);
oder wie?

mfg Sebi

64Jabor 20. Apr 2008 13:48

Re: BASS_StreamCreateFile: Access violation
 
Also, schnell noch hinterherschieben ^^

Wenn
Delphi-Quellcode:
BASS_StreamFree(Channel);
richtig ist, dann bringt es leider nichts...
Channel ist in dem Fall ja mein Handle, da definiert als DWORD.

mfg Sebi

NikoMitDaMacht 20. Apr 2008 13:57

Re: BASS_StreamCreateFile: Access violation
 
Überprüfe doch mal ob der Stream überhaupt geöffnet wird.
Delphi-Quellcode:
if Channel<>0 then
   if not BASS_ChannelPlay(Channel, True) then
      Error('Error playing stream!')
   else
else
   Error('Error opening stream!');
Ansonsten könnte es sein das es hiemit "PlayList.strings[SongNumber]" Probleme gibt?

64Jabor 20. Apr 2008 14:10

Re: BASS_StreamCreateFile: Access violation
 
Also, hier mal ein Codeausschnitt:

Delphi-Quellcode:
procedure TJP.PlaySong(SongNumber: integer);
var SongSecTime: String;
begin
if (fileexists(PlayList.Strings[SongNumber])) then //existierender Song ->
 begin
  BassPlayer.LoadFromFile(PlayList.Strings[SongNumber]); //Lied laden in DLLPlayer
  BassPlayer.Play;                                      //und abspielen
  BASS_channelstop(Channel);                            //Channel ggf. stoppen
  if Channel<>0 then                                    //Error-Blockade (siehe unten im Beitrag)
   if not BASS_ChannelPlay(Channel, True) then SHowMessage('Error playing stream!')
   else
  else SHowMessage('Error opening stream!');
  Channel := BASS_StreamCreateFile(FALSE, PChar(PlayList.strings[SongNumber]), 0, 0, 0); {Hier kommt der tolle Error}
  SongBalken.Max := BassPlayer.SongLength; //Trackbar anpassen
  SongBalken.position := 0;               //und resetten
  lbSongTimeMax.Caption := IntToStr(BassPlayer.SongLength div 60); //Liedzeiten in Label schreiben
  if (BassPlayer.SongLength div 60 < 10) then lbSongTimeMax.caption := '0' + lbSongTimeMax.caption;
  SongSecTime := IntToStr(BassPlayer.SongLength mod 60);
  if (BassPlayer.SongLength mod 60 < 10) then SongSecTime := '0' + SongSecTime;
  lbSongTimeMax.Caption := lbSongTimeMax.caption + ':' + SongSecTime;
 end
else ShowMessage('Ungültige Datei!'); //andernfalls ungültige Datei melden!
end;
Das ist die Prozedur die jedesmal aufgerufen wird, wenn ein SOng gespielt werden soll!
Bereits vorher ist die Bass.dll per

Delphi-Quellcode:
BASS_Init(-1, 44100, 0, Application.Handle, nil);
initialisiert.
BassPlayer ist ein TBassDLLPlayer, wo ich den herhab weiß ich ehrlich nicht mehr, aber er funktioniert sehr gut!
Hier in der Prozedur sieht man dass ich umsteigen möchte vom TBassDLLPlayer auf die BASS.dll weil mit dem DLLPlayer keine Visualisierung möglich ist!
So habe ich 2 getrennte Systeme - den BassPlayer und die Bass.dll - natürlich nur vorrübergehend, damit ich jederzeit abbrechen kann und in mein altes Schema verfallen kann - sollte es nicht funktionieren (Nachteil: 2 verscheidene gleichzeitig gespielte Lieder ^^).

Der oberste Code macht SO keinen Sinn, da der "Error" kommen MUSS!
Aber wenn ich den if-Teil UNTER die Zuweisung des Channel verlege, bekomme ich meinen hübschen Assembler-Code-Error sofort, HIER erst nach dem Klick auf "OK" der "ShowMessage".
Somit muss der Fehler in dieser Zuweisung liegen, wie seht ihr das?

mfg Sebi

64Jabor 20. Apr 2008 14:16

Re: BASS_StreamCreateFile: Access violation
 
Vielleicht bringt es was:
Wenn ich das Programm statt in der IDE ganz normale als EXE laufen lasse, geht es einfach aus - wobei das zu erwarten war ^^

mfg Sebi

NikoMitDaMacht 20. Apr 2008 14:29

Re: BASS_StreamCreateFile: Access violation
 
Mhhh... ich könnte mir vorstellen, dass der Fehler kommt weil der TBassPlayer auf die selbe DLL zugreift wie der normale Funtkionsaufruf (der Bassplayer macht ja auch nichts anderes).

Versuche doch mal die BassPlayer sachen auszukommentieren oder einfach den Bassplayer um die Vis zu erweitern.

Könntest du vieleicht auch mal dein Projekt anhängen?

64Jabor 21. Apr 2008 13:02

Re: BASS_StreamCreateFile: Access violation
 
Liste der Anhänge anzeigen (Anzahl: 1)
@nico
Hmm, die Überlegung ist sehr gut! Das könnte natürlich durchaus sein...

Natürlich kann ich das Projekt mal hier anhängen.
Ich verwende aber neben der TBassDLLPlayer und halt der Bass.pas auch die Komponente AlphaControls LE (Lite) von AlphaControls und noch Ovale Buttons von einer Sammelseite!
Diese beiden Dinge werdet ihr wohl brauchen um den MediaPlayer ganz korrekt laufen zu lassen...

Unten ist dass eine ZIP mit allem, außer den oben genannten Dingen, die ihr aber einfach herunterladen könnt...

Schaut euch den Code bitte an, ist teilweise auskommentiert, aber vieles erklärt sich von selbst - für seinen Programmierer ^^
Wenn ihr irgendwas nicht versteht und euch wundert was ich da für nen Mist mache, dann sagt das ruhig, bin auch für jeden Verbesserungsvorschlag dankbar ;)

mfg Sebi


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz