![]() |
Syntax SendMCICommand
Hallo Delphi-PRAXIS,
Ich möchte einen variablen Pfad in folgender ![]() Normalerweise würde der Aufruf ja wie folgt aussehen: Zitat:
Delphi-Quellcode:
Folgender Code ist falsch:
//Beispielsweise:
Pfad := ExtractFilePath(Application.ExeName) + '/Sounds/Sound1.wav';
Delphi-Quellcode:
Ich hoffe jemand versteht mein Problem, ist sicherlich wirklich nichts besonderes, ich weiß nur einfach nicht wie man das richtig schreibt...
SendMCICommand('play Pfad');
Danke für eure (hoffentliche) Hilfe |
AW: Syntax SendMCICommand
Delphi-Quellcode:
Pfad := '"'+ExtractFilePath(Application.ExeName) + '\Sounds\Sound1.wav"'
SendMCICommand('play ' + Pfad); |
AW: Syntax SendMCICommand
Zitat:
Delphi-Quellcode:
// Path = mit \ am Ende
Pfad := '"' + ExtractFilePath(Application.ExeName) + 'Sounds\Sound1.wav"'; SendMCICommand('play ' + Pfad); // Dir = ohne \ am Ende (gut, mit einer kleinen Ausnahme) Pfad := '"' + ExtractFileDir(Application.ExeName) + '\Sounds\Sound1.wav"'; SendMCICommand('play ' + Pfad); // aber da die " eigentlich nicht zum "Pfad" gehören Pfad := ExtractFilePath(Application.ExeName) + 'Sounds\Sound1.wav'; SendMCICommand('play "' + Pfad + '"'); |
AW: Syntax SendMCICommand
@himitsu
sorry und danke ... ich war müde... |
AW: Syntax SendMCICommand
Liste der Anhänge anzeigen (Anzahl: 1)
Super, danke für eure Hilfe!
Der Code sieht jetzt so aus:
Delphi-Quellcode:
Beim Debugging steht da, dass folgender Pfad raus kommt:
//globale Variable in Hauptform, weil ich nicht wusste wie ich das anders lösen sollte
ExePfad := ExtractFilePath(Application.ExeName); //in Extra Unit procedure SoundAbspielen(sound: byte); begin SendMCICommand('open waveaudio shareable'); case Sound of // 1: SendMCICommand('play "Sounds\Sound1.wav"'); //Funktioniert, ist aber nicht optimal 1: SendMCICommand('play "'+ExePfad+ 'Sounds\Sound1.wav"'); //Wirft einen Fehler auf end; SendMCICommand('close waveaudio'); end; SendMCICommand('play "C:\Users\...\Sounds\Sound1.wav"'); SendMCICommand gibt den Error aus dem Anhang aus. ("Gerät ist nicht geöffnet oder wird vom MCI nicht erkannt.") :?: Weiß jemand Rat? :?: |
AW: Syntax SendMCICommand
Liste der Anhänge anzeigen (Anzahl: 1)
(Ich kann den letzten Post jetzt leider nicht mehr editieren und im Nachhinein ist der Thread-Name ungünstig gewählt...)
Ich bin leider immer noch ratlos... In der Unit kann man ja
Delphi-Quellcode:
nicht verwenden, deshalb habe ich ja ExePfad als globale Variable, was ziemlich unschön ist... Könnte darin irgendwie der Fehler liegen?
ExtractFilePath(Application.ExeName)
Ich habe mal die relevanten Code-Teile in ein Delphi Projekt gesteckt... die Exe zum Testen ist im Debug Ordner. Ich hoffe damit kann mir jemand helfen... |
AW: Syntax SendMCICommand
Zitat:
PS: Application.ExeName = ParamStr(0) |
AW: Syntax SendMCICommand
Zitat:
Auf jeden Fall ist das schon mal optimaler, aber der blöde Fehler kommt trotzdem... |
AW: Syntax SendMCICommand
Warum nicht einfach playsound anstelle von SendMCICommand? wenn du damit nicht klar kommst.
Deklariert in winmm.dll
Delphi-Quellcode:
PlaySound('Pfad zur Wav Datei', 0, SND_FILENAME Or SND_ASYNC);
Andererseits kannst ja mal ![]() Einfach die Classe deinen bedürfnissen anpassen. Ist zwar für Midi gemacht geht aber auch mit Wave. gruss |
AW: Syntax SendMCICommand
Hallo EWeiss,
das Ding ist, ich brauche beides PlaySound und SendMCICommand. Der Sound wird häufig schnell hintereinander wiedergegeben und soll sich dabei überlagern, so wie sich das Geräusch von den Tasten die du drückst überlagert (wenn du das schnell hintereinander machst). Dazu habe ich nicht viel gefunden und habe es so gelöst, dass immer abwechselnd der Sound mit PlaySound oder mit SendMCICommand wiedergegeben wird. Das erreicht zufriedenstellend dieses Ziel. Darum muss SendMCICommand laufen... |
AW: Syntax SendMCICommand
Zitat:
Hatte nur herausgelesen du hättest einen Fehler. Zitat:
Delphi-Quellcode:
Man könnte noch den Type deklarieren..
unit MCIPlayer;
interface uses Windows, Messages, mmsystem, StrUtils, SysUtils, Dialogs; type TMCIPlayer = class private { private-Deklarationen } command: PWideChar; return: array [0..255] of Widechar; resultSize: Integer; protected { protected-Deklarationen } public { public-Deklarationen } duration: Integer; paused: Bool; function getPosition: Integer; procedure play; procedure pausePlay; procedure stop; constructor Create(fileName: string; autoplay: Bool); destructor Destroy; override; end; implementation { TMCIPlayer } constructor TMCIPlayer.Create(fileName: string; autoplay: Bool); var lResult: cardinal; begin //init variables paused := FALSE; resultSize := 255; // We want to play a File. command := PWideChar('open "' + fileName + '" type waveaudio alias mciplayer wait'); lResult := mciSendString(command, return, resultSize, 0); if lResult <> 0 then begin mciGetErrorString(lResult, return, 255); ShowMessage('MCI error:' + return); duration := 0; end; // Calculate duration command := ('set mciplayer time format milliseconds wait'); mciSendString(command, return, resultSize, 0); command := ('status mciplayer length wait'); mciSendString(command, return, resultSize, 0); if (StrLen(return) > 0) then duration := StrToInt(return) else duration := 0; if autoplay then play; end; destructor TMCIPlayer.Destroy; begin command := ('close mciplayer wait'); mciSendString(command, return, resultSize, 0); end; function TMCIPlayer.getPosition: Integer; begin command := ('status mciplayer position wait'); mciSendString(command, return, resultSize, 0); if (StrLen(return) > 0) then result := StrToInt(return) else result := 0; end; procedure TMCIPlayer.pausePlay; begin paused := not paused; if paused then begin command := ('pause mciplayer notify'); mciSendString(command, return, resultSize, 0); end else begin command := ('resume mciplayer notify'); mciSendString(command, return, resultSize, 0); end; end; procedure TMCIPlayer.play; begin command := ('play mciplayer notify'); mciSendString(command, return, resultSize, 0); end; procedure TMCIPlayer.stop; begin command := ('stop mciplayer notify'); mciSendString(command, return, resultSize, 0); end; end. Also sequencer für MIDI, waveaudio für Wave usw... um die Klasse für mehrere AudioDateien zugänglich zu machen aber das könnt ihr ja selber machen. Noch ein paar deviceType
Delphi-Quellcode:
gruss
// dType
// sequencer := MID, MIDI, RMI // waveaudio := WAVE // cdaudio := CDA // mpegvideo := AIF, AIFC, AIFF, AU, MP3, SND // mpegvideo2 := WMA // usw... myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Chariots Of Fire.mid', 'sequencer', False); |
AW: Syntax SendMCICommand
Liste der Anhänge anzeigen (Anzahl: 1)
Das sieht ja schon mal gut aus, danke EWeiss.
Zitat:
Ich habe die MCIPlayer Unit so wie sie ist eingebunden und so benutzt:
Delphi-Quellcode:
Das ist nur ein einfacher Test, wirft auch keine Fehler auf, aber hören tu ich keinen Sound...!?
unit uTest;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MCIPlayer; type TForm1 = class(TForm) PlayButton: TButton; DestroyButton: TButton; CreateButton: TButton; procedure PlayButtonClick(Sender: TObject); procedure CreateButtonClick(Sender: TObject); procedure DestroyButtonClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } myMCIPlayer: TMCIPlayer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.DestroyButtonClick(Sender: TObject); begin myMCIPlayer.Destroy; end; procedure TForm1.PlayButtonClick(Sender: TObject); begin myMCIPlayer.play; end; procedure TForm1.CreateButtonClick(Sender: TObject); var Pfad : string; begin Pfad := ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav'; myMCIPlayer := TMCIPlayer.Create(Pfad, False); end; end. Benutze ich das falsch? (Ich hab das ganze wieder gepackt und in den Anhang gesteckt...) |
AW: Syntax SendMCICommand
Er wirft einen Fehler und zwar dann wenn man nicht vorher auf create geklickt hat
und die Datei abspielen will. Ansonsten! Ich höre Sound.. Du kannst ja mal folgendes ersetzen..
Delphi-Quellcode:
constructor Create(fileName: string; dtype: string; autoplay: Bool);
Delphi-Quellcode:
constructor TMCIPlayer.Create(fileName: string; dtype: string; autoplay: Bool);
var lResult: cardinal; begin //init variables paused := FALSE; resultSize := 255; // We want to play a File. command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias mciplayer wait'); lResult := mciSendString(command, return, resultSize, 0);
Delphi-Quellcode:
myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Meine.mp3', 'mpegvideo', False);
Sollte spielen .. bzw wie schon gesagt geht dein *.wav auch. gruss |
AW: Syntax SendMCICommand
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Desweiteren, wie kann man dabei die Lautstärke beeinflussen? gruß |
AW: Syntax SendMCICommand
Zitat:
Mir ging es darum das du mal ne einfache MP3 Testen tust.. ;) Zitat:
War ja nur eine Datei unter Sounds und die funktioniert bei mir. Zitat:
Delphi-Quellcode:
hättest du ruhig lassen können ;)
Pfad := ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav';
myMCIPlayer := TMCIPlayer.Create(Pfad, 'waveaudio', False); gruss |
AW: Syntax SendMCICommand
Zitat:
Zitat:
Zitat:
Aktuell sieht's jetzt so aus:
Delphi-Quellcode:
Wie gewohnt aber kein Sound... Ich habs auch mit mpegvideo und ner *.mp3 versucht, aber da auch kein Ton...
Pfad := ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav';
myMCIPlayer := TMCIPlayer.Create(Pfad, 'waveaudio', False); |
AW: Syntax SendMCICommand
Zitat:
Zitat:
Kannst nur hoffen das es jemand anderer hier im forum nochmal testet. Geht alles hier mp3 und wave gruss |
AW: Syntax SendMCICommand
Zitat:
Zitat:
Riesen Dank für deine Hilfe erstmal :dp: |
AW: Syntax SendMCICommand
Zitat:
gruss |
AW: Syntax SendMCICommand
Ich habe einfach alles nochmal in mein anderes Sample mit der Lautstärke reingeschrieben und ja, wie soll ich sagen, auf einmal höre ich Sounds :thumb:
Jetzt bin ich mir nur nicht ganz schlüssig, wie ich das am klügsten lösen soll. Der Sinn war ja immer wenn der Sound ausgeführt werden soll, im Beispiel bei jedem Tastenschlag ins Editfeld immer im Wechsel SoundAbspielen1 und SoundAbspielen2 aufzurufen. SoundAbspielen1 wird jetzt die Variante mit MCI.
Delphi-Quellcode:
Natürlich muss der myMCIPlayer erstellt und auch wieder zerstört werden. Hier nun die Frage: Wie löse ich das am klügsten?
procedure SoundAbspielen1;
begin myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', False); myMCIPlayer.play; end; Er soll also am besten unmittelbar vor dem Soundabspielen erstellt werden und sofort danach zerstört werden. Aber wie? Folgendes funktioniert ja nicht:
Delphi-Quellcode:
So würde der Sound kaum einen Bruchteil einer Sekunde angespielt werden, weil man ihm den Player gleich wieder wegnimmt...
procedure SoundAbspielen1;
begin myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', False); myMCIPlayer.play; myMCIPlayer.destroy; end; |
AW: Syntax SendMCICommand
Delphi-Quellcode:
Hast du dir mal die Variable autoplay angeschaut?
procedure SoundAbspielen1;
begin myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', False); myMCIPlayer.play; end; Wenn ja warum verwendest du sie dann nicht und entfernst das
Delphi-Quellcode:
myMCIPlayer.play;
Dann benötigst du nur Create und Destroy.. Alternativ könntest du auch noch eine neue procedure einbauen in der du close verwendest und die Funktionen aus Destroy dort einfügst. gruss |
AW: Syntax SendMCICommand
Das mit dem Autoplay ist schon mal super, hätte ich auch drauf kommen können...
Delphi-Quellcode:
myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', True);
Delphi-Quellcode:
Ja, das ist gut, nur das Problem ist für mich das Destroy...
Dann benötigst du nur Create und Destroy..
Delphi-Quellcode:
Also eine Prozedur, die das selbe macht wie Destroy, nur nicht als destructor läuft?
Alternativ könntest du auch noch eine neue procedure einbauen
in der du close verwendest und die Funktionen aus Destroy dort einfügst. Aber warum, was bringt das? Ich habe ja immernoch das Problem, dass ich nicht weiß wo/wann ich den Player zerstöre... Hast du (oder jemand anders) dafür ne Idee? |
AW: Syntax SendMCICommand
Delphi-Quellcode:
Wäre eine möglichkeit.
procedure SoundAbspielen1;
begin if assigned(myMCIPlayer) then myMCIPlayer.Destroy; myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', true); end; procedure SoundAbspielen2; begin myMCIPlayer.Destroy; myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', true); end; Nicht getestet. oder halt nen Schalter zwichenschalten zwischen SoundAbspielen1 und SoundAbspielen2
Delphi-Quellcode:
Isplaying := not IsPlaying
if IsPlaying and assigned(myMCIPlayer) then myMCIPlayer.Destroy else myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', true); gruss |
AW: Syntax SendMCICommand
Mit dem assigned kann man was anfangen
Delphi-Quellcode:
Damit lässt es sich dann auch lösen. Danke!
if assigned(myMCIPlayer) then
myMCIPlayer.Destroy; Kann man auch zwei MCIPlayer gleichzeitig erstellen? myMCIPlayer1 und myMCIPlayer2 oder so? |
AW: Syntax SendMCICommand
Zitat:
Zitat:
myMCIPlayer1 alias = 'mciplayer1' myMCIPlayer2 alias = 'mciplayer2' Du kannst keine zwei Instanzen mit dem selben alias erstellen. gruss |
AW: Syntax SendMCICommand
Zitat:
Zitat:
|
AW: Syntax SendMCICommand
Zitat:
Wie man diesen benennt ist eigentlich egal er muss nur für jede instanz gleich sein.
Delphi-Quellcode:
In unserem Fall ist der alias mciplayer
// We want to play a File.
command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias mciplayer wait'); lResult := mciSendString(command, return, resultSize, 0); 'alias mciplayer wait' In allen Functionen muss also bei einer neuen Instanz ein anderer Alias angegeben werden.
Delphi-Quellcode:
constructor TMCIPlayer.Create(fileName: string; dtype: string; alias: string; autoplay: Bool);
Und ersetze alle !mciplayer! mit dieser Variable also
Delphi-Quellcode:
bsp.. für Play
// We want to play a File.
command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias ' + alias + ' wait'); lResult := mciSendString(command, return, resultSize, 0);
Delphi-Quellcode:
procedure TMCIPlayer.play(alias: string);
begin command := ('play ' + alias + ' notify'); mciSendString(command, return, resultSize, 0); end;
Delphi-Quellcode:
myMCIPlayer1 := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', 'mciplayer1', true);
myMCIPlayer2 := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound2.wav', 'waveaudio', 'mciplayer2', true); gruss |
AW: Syntax SendMCICommand
Erstmal Danke für die verständliche Erklärung.
Delphi-Quellcode:
Auch bei Destroy?
Und ersetze alle !mciplayer! mit dieser Variable
Delphi-Quellcode:
Es kommt der Fehler: "Deklaration von 'Destroy' unterscheidet sich von vorheriger Deklaration."
public
{ public-Deklarationen } //... destructor Destroy(alias: string); override; end; //... destructor TMCIPlayer.Destroy(alias: string); begin command := ('close '+ alias +' wait'); mciSendString(command, return, resultSize, 0); end; |
AW: Syntax SendMCICommand
Zitat:
Ansonsten ja auch bei Destroy.. Hmm override;? gruss |
AW: Syntax SendMCICommand
Zitat:
EDIT: Hab dein Edit nicht gesehen, sorry ;) Das ist die MCIPlayer unit...
Delphi-Quellcode:
unit MCIPlayer;
interface uses Windows, Messages, mmsystem, StrUtils, SysUtils, Dialogs; type TMCIPlayer = class private { private-Deklarationen } command: PWideChar; return: array [0..255] of Widechar; resultSize: Integer; protected { protected-Deklarationen } public { public-Deklarationen } duration: Integer; paused: Bool; function getPosition(alias: string): Integer; procedure play(alias: string); procedure pausePlay(alias: string); procedure stop(alias: string); constructor Create(fileName: string; dtype: string; alias: string; autoplay: Bool); destructor Destroy(alias: string); override; {<<<<<<<<<<<} end; implementation constructor TMCIPlayer.Create(fileName: string; dtype: string; alias: string; autoplay: Bool); var lResult: cardinal; begin //Variablen initiieren paused := FALSE; resultSize := 255; // We want to play a File. command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias ' + alias + ' wait'); lResult := mciSendString(command, return, resultSize, 0); if lResult <> 0 then begin mciGetErrorString(lResult, return, 255); ShowMessage('MCI error:' + return); duration := 0; end; // Calculate duration command := ('set mciplayer time format milliseconds wait'); mciSendString(command, return, resultSize, 0); command := ('status mciplayer length wait'); mciSendString(command, return, resultSize, 0); if (StrLen(return) > 0) then duration := StrToInt(return) else duration := 0; if autoplay then play; end; destructor TMCIPlayer.Destroy(alias: string); begin command := ('close '+ alias +' wait'); mciSendString(command, return, resultSize, 0); end; function TMCIPlayer.getPosition(alias: string): Integer; begin command := ('status '+ alias +' position wait'); mciSendString(command, return, resultSize, 0); if (StrLen(return) > 0) then result := StrToInt(return) else result := 0; end; procedure TMCIPlayer.pausePlay(alias: string); begin paused := not paused; if paused then begin command := ('pause '+ alias +' notify'); mciSendString(command, return, resultSize, 0); end else begin command := ('resume '+ alias +' notify'); mciSendString(command, return, resultSize, 0); end; end; procedure TMCIPlayer.play(alias: string); begin command := ('play ' + alias + ' notify'); mciSendString(command, return, resultSize, 0); end; procedure TMCIPlayer.stop(alias: string); begin command := ('stop '+ alias +' notify'); mciSendString(command, return, resultSize, 0); end; end. |
AW: Syntax SendMCICommand
Delphi-Quellcode:
destructor Destroy(alias: string); reintroduce;
Delphi-Quellcode:
fehlt noch das alias hinter play ;)
if autoplay then
play; und alias mciplayer bei duration wurde noch nicht ersetzt.
Delphi-Quellcode:
gruss
// Calculate duration
command := ('set mciplayer time format milliseconds wait'); mciSendString(command, return, resultSize, 0); command := ('status mciplayer length wait'); mciSendString(command, return, resultSize, 0); if (StrLen(return) > 0) then duration := StrToInt(return) else duration := 0; |
AW: Syntax SendMCICommand
Okay.
Jetzt hat er nur noch ein Problem damit, dass das command ein PWideChar ist, aber alias ein string... also zum Beispiel
Delphi-Quellcode:
wirft einen Fehler auf (Inkompatible Typen: 'PWideChar und 'String').
command := ('set '+ alias +' time format milliseconds wait');
Hingegen
Delphi-Quellcode:
erkennt er nicht als Fehler...
command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias ' + alias + ' wait');
|
AW: Syntax SendMCICommand
Wäre es nicht geschickter den Alias beim Create in einer private Variable zu merken, dann muss der nicht bei jedem Aufruf wieder mitgegeben werden, sondern die Instanz verwaltet den selber?
Und der direkte Aufruf von Destroy ist ja auch nicht StateOfTheArt :) besser wäre Free Evtl. könnte man im Create auch einen eindeutigen Namen erzeugen lassen, dann verwaltet die Klasse das komplett selber |
AW: Syntax SendMCICommand
Zitat:
Wenn zwei Instanzen Arbeiten benötigst du auch 2 Unterschiedliche alias was man machen könnte wäre ein FAlias: array of string. Zitat:
Ist mir bei den ganzen hin und her nicht aufgefallen ;) Das problem aber in Destroy steht das Alias welches behandelt werden muss. Nur mit Free geht es so im moment nicht. Müßte man dann erst noch mit einer variablen ändern. Im moment geht es erstmal so. Im Anhang die korrigierte mit PWideChar.. Zitat:
Lust das zu ändern ? gruss |
AW: Syntax SendMCICommand
Super, so zusammengeschustert klappt alles :)
Top :thumb: Zitat:
Vielen Dank an alle Beteiligten von meiner Seite nochmal :dp: EDIT: Eine Frage noch: Was mache ich jetzt, Free oder Destroy? Zitat:
|
AW: Syntax SendMCICommand
Zitat:
Im moment Destroy da unser alias noch nicht von der Classe selbst verwaltet wird. gruss |
AW: Syntax SendMCICommand
Zitat:
|
AW: Syntax SendMCICommand
Zitat:
Delphi-Quellcode:
Aufruf mit:
unit uMciPlayer;
interface uses Classes; type TMciPlayerState = ( mpsWait, mpsPlay, mpsPause ); TMciPlayer = class private FAlias : string; FState : TMciPlayerState; FDuration : Integer; FLastResult : Cardinal; FLastResultStr : string; function GetPosition : Integer; protected procedure DoCallCommand( const CmdStr : string ); public constructor Create( const aAlias, aFileName : string; AutoPlay : Boolean = False ); destructor Destroy; override; procedure Play; procedure Stop; procedure Pause; procedure Resume; property Alias : string read FAlias; property State : TMciPlayerState read FState; property Duration : Integer read FDuration; property Position : Integer read GetPosition; property LastResult : Cardinal read FLastResult; property LastResultStr : string read FLastResultStr; end; implementation uses Winapi.MMSystem, System.SysUtils; { TMciPlayer } constructor TMciPlayer.Create( const aAlias, aFileName : string; AutoPlay : Boolean ); begin inherited Create; FState := mpsWait; FAlias := aAlias; FDuration := 0; DoCallCommand( 'open "' + aFileName + '" alias ' + aAlias ); if LastResult = 0 then begin DoCallCommand( 'set ' + FAlias + ' time format milliseconds wait' ); DoCallCommand( 'status ' + FAlias + ' length wait' ); FDuration := StrToIntDef( LastResultStr, 0 ); end; if AutoPlay then Play; end; destructor TMciPlayer.Destroy; begin DoCallCommand( 'close ' + FAlias + ' wait' ); inherited; end; procedure TMciPlayer.DoCallCommand( const CmdStr : string ); var lResultSize : Cardinal; lReturn : array [0 .. 255] of WideChar; begin lResultSize := 255; FLastResult := mciSendString( PWideChar( CmdStr ), lReturn, lResultSize, 0 ); if FLastResult <> 0 then begin mciGetErrorString( FLastResult, lReturn, 255 ); FLastResultStr := lReturn; end else FLastResultStr := lReturn; end; function TMciPlayer.GetPosition : Integer; begin DoCallCommand( 'status ' + FAlias + ' position wait' ); Result := StrToIntDef( FLastResultStr, 0 ); end; procedure TMciPlayer.Pause; begin if FState = mpsPlay then begin DoCallCommand( 'pause ' + FAlias + ' notify' ); FState := mpsPause; end; end; procedure TMciPlayer.Play; begin if FState = mpsWait then begin DoCallCommand( 'play ' + FAlias + ' notify' ); FState := mpsPlay; end else Resume; end; procedure TMciPlayer.Resume; begin if FState = mpsPause then begin DoCallCommand( 'resume ' + FAlias + ' notify' ); FState := mpsPlay; end; end; procedure TMciPlayer.Stop; begin if FState <> mpsWait then begin DoCallCommand( 'stop ' + FAlias + ' notify' ); FState := mpsWait; end; end; end.
Delphi-Quellcode:
Könnte man auch noch schön erweitern, so dass man auch das Soundfile der Instanz ändern kann.
var
Player1, Player2 : TMciPlayer; begin Player1 := TMciPlayer.Create( 'Player1', 'Sample1.wav' ); Player2 := TMciPlayer.Create( 'Irgendwas2', 'Sample2.mp3' ); Player1.Play; Player2.Play; // irgendwann dann auch mal Player1.Free; Player2.Free; end; |
AW: Syntax SendMCICommand
@Sir Rufo
Feine sache.. Gut gelößt mit dem DoCallCommand ;) gruss |
AW: Syntax SendMCICommand
Zitat:
Delphi-Quellcode:
geht, dann geht garantiert auch
if assigned(myMCIPlayer) then myMCIPlayer.Destroy;
Delphi-Quellcode:
, denn rate mal was Free macht.
myMCIPlayer.Free;
Wenn aber myMCIPlayer weiterhin verwendet wird, dann sollte man
Delphi-Quellcode:
verwenden.
FreeAndNil(myMCIPlayer);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz