Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr.
Seite 2 von 6     12 34     Letzte »    

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