Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Syntax SendMCICommand (https://www.delphipraxis.net/169470-syntax-sendmcicommand.html)

Dunkelbunt27 22. Jul 2012 21:12

Syntax SendMCICommand
 
Hallo Delphi-PRAXIS,

Ich möchte einen variablen Pfad in folgender Prozedur einsetzen?

Normalerweise würde der Aufruf ja wie folgt aussehen:
Zitat:

Delphi-Quellcode:
SendMCICommand('open waveaudio shareable');
SendMCICommand('play "C:\xyz\BackgroundMusic.wav"');
SendMCICommand('play "C:\xyz\AnotherMusic.wav"');
SendMCICommand('close waveaudio');

Wenn man aber keinen festen Pfad angeben möchte, sondern den Pfad der in dem String "Pfad" gespeichert ist nutzen will, wie schreibt man das syntaktisch?

Delphi-Quellcode:
//Beispielsweise:
Pfad := ExtractFilePath(Application.ExeName) + '/Sounds/Sound1.wav';
Folgender Code ist falsch:
Delphi-Quellcode:
SendMCICommand('play Pfad');
Ich hoffe jemand versteht mein Problem, ist sicherlich wirklich nichts besonderes, ich weiß nur einfach nicht wie man das richtig schreibt...

Danke für eure (hoffentliche) Hilfe

Bummi 22. Jul 2012 22:17

AW: Syntax SendMCICommand
 
Delphi-Quellcode:
Pfad := '"'+ExtractFilePath(Application.ExeName) + '\Sounds\Sound1.wav"'
SendMCICommand('play ' + Pfad);

himitsu 22. Jul 2012 23:02

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Bummi (Beitrag 1175591)
Delphi-Quellcode:
Pfad := '"'+ExtractFilePath(Application.ExeName) + '\Sounds\Sound1.wav"'
SendMCICommand('play ' + Pfad);

\\ ?

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 + '"');

Bummi 23. Jul 2012 06:24

AW: Syntax SendMCICommand
 
@himitsu

sorry und danke ... ich war müde...

Dunkelbunt27 23. Jul 2012 09:59

AW: Syntax SendMCICommand
 
Liste der Anhänge anzeigen (Anzahl: 1)
Super, danke für eure Hilfe!
Der Code sieht jetzt so aus:
Delphi-Quellcode:
//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;
Beim Debugging steht da, dass folgender Pfad raus kommt:
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? :?:

Dunkelbunt27 24. Jul 2012 16:21

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:
ExtractFilePath(Application.ExeName)
nicht verwenden, deshalb habe ich ja ExePfad als globale Variable, was ziemlich unschön ist... Könnte darin irgendwie der Fehler liegen?

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...

himitsu 24. Jul 2012 16:41

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1175787)
In der Unit kann man ja
Delphi-Quellcode:
ExtractFilePath(Application.ExeName)
nicht verwenden,

Wieso nicht?

PS: Application.ExeName = ParamStr(0)

Dunkelbunt27 24. Jul 2012 16:51

AW: Syntax SendMCICommand
 
Zitat:

Zitat von himitsu (Beitrag 1175788)
PS: Application.ExeName = ParamStr(0)

Okay danke, das kannte ich noch nicht.
Auf jeden Fall ist das schon mal optimaler, aber der blöde Fehler kommt trotzdem...

EWeiss 24. Jul 2012 17:52

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 hier schauen.

Einfach die Classe deinen bedürfnissen anpassen.
Ist zwar für Midi gemacht geht aber auch mit Wave.


gruss

Dunkelbunt27 24. Jul 2012 18:07

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...

EWeiss 24. Jul 2012 19:52

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1175798)
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...

Ah jo wenn es dann so läuft. ;)
Hatte nur herausgelesen du hättest einen Fehler.

Zitat:

Gerät ist nicht geöffnet oder wird vom MCI nicht erkannt.
Trotzdem nochmal die leicht abgeänderte Classe
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: 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.
Man könnte noch den Type deklarieren..
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:
  // 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);
gruss

Dunkelbunt27 25. Jul 2012 11:56

AW: Syntax SendMCICommand
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das sieht ja schon mal gut aus, danke EWeiss.
Zitat:

Man könnte noch den Type deklarieren..
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.
Ich brauch erstmal nur WAVE-Dateien.

Ich habe die MCIPlayer Unit so wie sie ist eingebunden und so benutzt:
Delphi-Quellcode:
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.
Das ist nur ein einfacher Test, wirft auch keine Fehler auf, aber hören tu ich keinen Sound...!?
Benutze ich das falsch?

(Ich hab das ganze wieder gepackt und in den Anhang gesteckt...)

EWeiss 25. Jul 2012 12:04

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

Dunkelbunt27 25. Jul 2012 12:35

AW: Syntax SendMCICommand
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Er wirft einen Fehler und zwar dann wenn man nicht vorher auf create geklickt hat
und die Datei abspielen will.
Soweit war ich zum Glück auch schon :)

Zitat:

Ansonsten!
Ich höre Sound..
Hast du mal die Datei ausprobiert die ich angehängt habe? Ich höre auch nach deinem Änderungsvorschlag keinen Sound, egal wie laut ich mein System drehe :?:

Zitat:

myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Meine.mp3', 'mpegvideo', False);

Sollte spielen .. bzw wie schon gesagt geht dein *.wav auch.
Ich schätze mal ich müsste dann statt mpegvideo waveaudio schreiben, richtig?

Desweiteren, wie kann man dabei die Lautstärke beeinflussen?

gruß

EWeiss 25. Jul 2012 12:41

AW: Syntax SendMCICommand
 
Zitat:

Ich schätze mal ich müsste dann statt mpegvideo waveaudio schreiben, richtig?
Ja wenn du weiterhin Wave Dateien abspielen willst.
Mir ging es darum das du mal ne einfache MP3 Testen tust.. ;)

Zitat:

Hast du mal die Datei ausprobiert die ich angehängt habe?
Ohne den Quelltext geöffnet zu haben getetstet!
War ja nur eine Datei unter Sounds und die funktioniert bei mir.

Zitat:

Desweiteren, wie kann man dabei die Lautstärke beeinflussen?
Das tust du doch schon im anderen Sample.

Delphi-Quellcode:
  Pfad := ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav';
  myMCIPlayer := TMCIPlayer.Create(Pfad, 'waveaudio', False);
hättest du ruhig lassen können ;)

gruss

Dunkelbunt27 25. Jul 2012 13:08

AW: Syntax SendMCICommand
 
Zitat:

Ja wenn du weiterhin Wave Dateien abspielen willst.
Mir ging es darum das du mal ne einfache MP3 Testen tust..
Ja, ich will nur wave Dateien abspielen.

Zitat:

War ja nur eine Datei unter Sounds und die funktioniert bei mir.
Warum höre ich dann bei menem eigenen Programm keinen Sound!? :shock:

Zitat:

Zitat:

Desweiteren, wie kann man dabei die Lautstärke beeinflussen?
Das tust du doch schon im anderen Sample.
:wiejetzt: Wie meinst du das?

Aktuell sieht's jetzt so aus:
Delphi-Quellcode:
Pfad := ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav';
myMCIPlayer := TMCIPlayer.Create(Pfad, 'waveaudio', False);
Wie gewohnt aber kein Sound... Ich habs auch mit mpegvideo und ner *.mp3 versucht, aber da auch kein Ton...

EWeiss 25. Jul 2012 13:13

AW: Syntax SendMCICommand
 
Zitat:

Wie meinst du das?
Du veränderst doch schon über Spin die lautstärke in dem alten Sample oder nicht?

Zitat:

Wie gewohnt aber kein Sound... Ich habs auch mit mpegvideo und ner *.mp3 versucht, aber da auch kein Ton...
Dann ist irgend etwas in deinem System nicht in Ordnung bei mir gehts.

Kannst nur hoffen das es jemand anderer hier im forum nochmal testet.

Geht alles hier mp3 und wave

gruss

Dunkelbunt27 25. Jul 2012 13:17

AW: Syntax SendMCICommand
 
Zitat:

Du veränderst doch schon über Spin die lautstärke in dem alten Sample oder nicht?
Ah okay, gut, stimmt natürlich.

Zitat:

Dann ist irgend etwas in deinem System nicht in Ordnung bei mir gehts.
Kannst nur hoffen das es jemand anderer hier im forum nochmal testet.
Geht alles hier mp3 und wave
Ein bisschen beunruhigend, mal schauen wie es sich auf anderen PC's verhält.

Riesen Dank für deine Hilfe erstmal :dp:

EWeiss 25. Jul 2012 13:18

AW: Syntax SendMCICommand
 
Zitat:

Riesen Dank für deine Hilfe erstmal
Kein Problem mach ich gern wenn ich kann :)

gruss

Dunkelbunt27 25. Jul 2012 13:35

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:
procedure SoundAbspielen1;
begin
  myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', False);
  myMCIPlayer.play;
end;
Natürlich muss der myMCIPlayer erstellt und auch wieder zerstört werden. Hier nun die Frage: Wie löse ich das am klügsten?
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:
procedure SoundAbspielen1;
begin
  myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', False);
  myMCIPlayer.play;
  myMCIPlayer.destroy;
end;
So würde der Sound kaum einen Bruchteil einer Sekunde angespielt werden, weil man ihm den Player gleich wieder wegnimmt...

EWeiss 25. Jul 2012 13:51

AW: Syntax SendMCICommand
 
Delphi-Quellcode:
procedure SoundAbspielen1;
 begin
   myMCIPlayer := TMCIPlayer.Create(ExtractFilePath(Paramstr(0)) + 'Sounds\Sound1.wav', 'waveaudio', False);
   myMCIPlayer.play;
 end;
Hast du dir mal die Variable autoplay angeschaut?
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

Dunkelbunt27 25. Jul 2012 14:00

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:
Dann benötigst du nur Create und Destroy..
Ja, das ist gut, nur das Problem ist für mich das Destroy...
Delphi-Quellcode:
Alternativ könntest du auch noch eine neue procedure einbauen
in der du close verwendest und die Funktionen aus Destroy dort einfügst.
Also eine Prozedur, die das selbe macht wie Destroy, nur nicht als destructor läuft?
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?

EWeiss 25. Jul 2012 14:04

AW: Syntax SendMCICommand
 
Delphi-Quellcode:
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;
Wäre eine möglichkeit.
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

Dunkelbunt27 25. Jul 2012 14:15

AW: Syntax SendMCICommand
 
Mit dem assigned kann man was anfangen
Delphi-Quellcode:
if assigned(myMCIPlayer) then
myMCIPlayer.Destroy;
Damit lässt es sich dann auch lösen. Danke!

Kann man auch zwei MCIPlayer gleichzeitig erstellen? myMCIPlayer1 und myMCIPlayer2 oder so?

EWeiss 25. Jul 2012 14:16

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1175887)
Mit dem assigned kann man was anfangen
Delphi-Quellcode:
if assigned(myMCIPlayer) then
myMCIPlayer.Destroy;
Damit lässt es sich dann auch lösen. Danke!

Ok alternativ siehe oben EDIT: der Schalter..

Zitat:

Kann man auch zwei MCIPlayer gleichzeitig erstellen? myMCIPlayer1 und myMCIPlayer2 oder so?
Ja dafür mußt du dann aber das alias mciplayer ebenfalls als string(variable) auslegen und bei einer neuen Instanz einen anderen wert angeben.

myMCIPlayer1 alias = 'mciplayer1'
myMCIPlayer2 alias = 'mciplayer2'

Du kannst keine zwei Instanzen mit dem selben alias erstellen.

gruss

Dunkelbunt27 25. Jul 2012 14:41

AW: Syntax SendMCICommand
 
Zitat:

Du kannst keine zwei Instanzen mit dem selben alias erstellen.
Okay.
Zitat:

Ja dafür mußt du dann aber das alias mciplayer ebenfalls als string(variable) auslegen und bei einer neuen Instanz einen anderen wert angeben.

myMCIPlayer1 alias = 'mciplayer1'
myMCIPlayer2 alias = 'mciplayer2'
:gruebel: Also mit diesem Alias steh ich auf Kriegsfuß... ich hab das nie irgendwo gehabt und weiß damit dementsprechend leider auch nichts anzufangen...

EWeiss 25. Jul 2012 14:53

AW: Syntax SendMCICommand
 
Zitat:

Also mit diesem Alias steh ich auf Kriegsfuß... ich hab das nie irgendwo gehabt und weiß damit dementsprechend leider auch nichts anzufangen...
bei jeder Function.. Procedure wird bei command eine ID = Alias verwendet um die aktuelle Instanz zu identifizieren.
Wie man diesen benennt ist eigentlich egal er muss nur für jede instanz gleich sein.

Delphi-Quellcode:
   // We want to play a File.
   command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias mciplayer wait');
   lResult := mciSendString(command, return, resultSize, 0);
In unserem Fall ist der alias mciplayer
'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:
   // We want to play a File.
   command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias ' + alias + ' wait');
   lResult := mciSendString(command, return, resultSize, 0);
bsp.. für Play

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

Dunkelbunt27 25. Jul 2012 15:03

AW: Syntax SendMCICommand
 
Erstmal Danke für die verständliche Erklärung.

Delphi-Quellcode:
Und ersetze alle !mciplayer! mit dieser Variable
Auch bei Destroy?

Delphi-Quellcode:
   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;
Es kommt der Fehler: "Deklaration von 'Destroy' unterscheidet sich von vorheriger Deklaration."

EWeiss 25. Jul 2012 15:04

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1175897)
Erstmal Danke für die verständliche Erklärung.

Delphi-Quellcode:
Und ersetze alle !mciplayer! mit dieser Variable
Auch bei Destroy?

Delphi-Quellcode:
   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;
Es kommt der Fehler: "Deklaration von 'Destroy' unterscheidet sich von vorheriger Deklaration."

Dann füge die neue Declaration auch in der Classe ein ;) ups. hast du ja.
Ansonsten ja auch bei Destroy..

Hmm override;?

gruss

Dunkelbunt27 25. Jul 2012 15:19

AW: Syntax SendMCICommand
 
Zitat:

Dann füge die neue Declaration auch in der Classe ein ups. hast du ja.
Ansonsten ja auch bei Destroy..
Naja, ist sie doch, oder?
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.

EWeiss 25. Jul 2012 15:25

AW: Syntax SendMCICommand
 
Delphi-Quellcode:
destructor Destroy(alias: string); reintroduce;
Delphi-Quellcode:
   if autoplay then
        play;
fehlt noch das alias hinter play ;)

und alias mciplayer bei duration wurde noch nicht ersetzt.

Delphi-Quellcode:
   // 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;
gruss

Dunkelbunt27 25. Jul 2012 15:39

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:
command := ('set '+ alias +' time format milliseconds wait');
wirft einen Fehler auf (Inkompatible Typen: 'PWideChar und 'String').

Hingegen
Delphi-Quellcode:
command := PWideChar('open "' + fileName + '" type ' + dtype + ' alias ' + alias + ' wait');
erkennt er nicht als Fehler...

Sir Rufo 25. Jul 2012 15:44

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

EWeiss 25. Jul 2012 15:48

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Sir Rufo (Beitrag 1175903)
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?

Nein da der Alias von außen geändert werden muss.
Wenn zwei Instanzen Arbeiten benötigst du auch 2 Unterschiedliche alias was man machen könnte wäre ein
FAlias: array of string.

Zitat:

Und der direkte Aufruf von Destroy ist ja auch nicht StateOfTheArt :) besser wäre Free
Korrekt dafür ist es ja da :)

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:

Evtl. könnte man im Create auch einen eindeutigen Namen erzeugen lassen, dann verwaltet die Klasse das komplett selber
Würde mich mal interessieren wie das bei dir aussehen würde :)
Lust das zu ändern ?


gruss

Dunkelbunt27 25. Jul 2012 15:56

AW: Syntax SendMCICommand
 
Super, so zusammengeschustert klappt alles :)
Top :thumb:

Zitat:

Würde mich mal interessieren wie das bei dir aussehen würde :)
mich auch hehe :stupid:

Vielen Dank an alle Beteiligten von meiner Seite nochmal :dp:

EDIT:
Eine Frage noch: Was mache ich jetzt, Free oder Destroy?
Zitat:

Zitat von Sir Rufo (Beitrag 1175903)
Und der direkte Aufruf von Destroy ist ja auch nicht StateOfTheArt :) besser wäre Free


EWeiss 25. Jul 2012 16:00

AW: Syntax SendMCICommand
 
Zitat:

Zitat von Dunkelbunt27 (Beitrag 1175905)
Super, so zusammengeschustert klappt alles :)
Top :thumb:

Zitat:

Würde mich mal interessieren wie das bei dir aussehen würde :)
mich auch hehe :stupid:

Vielen Dank an alle Beteiligten von meiner Seite nochmal :dp:

zusammengeschustert ? Hehehehe..
Im moment Destroy da unser alias noch nicht von der Classe selbst verwaltet wird.

gruss

Dunkelbunt27 25. Jul 2012 16:13

AW: Syntax SendMCICommand
 
Zitat:

zusammengeschustert ? Hehehehe..
Ich versteh schon :-D

Sir Rufo 25. Jul 2012 17:43

AW: Syntax SendMCICommand
 
Zitat:

Zitat von EWeiss (Beitrag 1175904)
Zitat:

Zitat von Sir Rufo (Beitrag 1175903)
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?

Nein da der Alias von außen geändert werden muss.
Wenn zwei Instanzen Arbeiten benötigst du auch 2 Unterschiedliche alias was man machen könnte wäre ein
FAlias: array of string.

Nun ja, ich hatte an so etwas gedacht
Delphi-Quellcode:
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.
Aufruf mit:
Delphi-Quellcode:
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;
Könnte man auch noch schön erweitern, so dass man auch das Soundfile der Instanz ändern kann.

EWeiss 25. Jul 2012 17:46

AW: Syntax SendMCICommand
 
@Sir Rufo

Feine sache..
Gut gelößt mit dem DoCallCommand ;)

gruss

himitsu 25. Jul 2012 19:43

AW: Syntax SendMCICommand
 
Zitat:

Zitat von EWeiss (Beitrag 1175904)
Nur mit Free geht es so im moment nicht.

Wenn
Delphi-Quellcode:
if assigned(myMCIPlayer) then myMCIPlayer.Destroy;
geht, dann geht garantiert auch
Delphi-Quellcode:
myMCIPlayer.Free;
, denn rate mal was Free macht.

Wenn aber myMCIPlayer weiterhin verwendet wird, dann sollte man
Delphi-Quellcode:
FreeAndNil(myMCIPlayer);
verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Seite 1 von 2  1 2      

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