AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Syntax SendMCICommand

Ein Thema von Dunkelbunt27 · begonnen am 22. Jul 2012 · letzter Beitrag vom 18. Aug 2014
Antwort Antwort
Seite 1 von 2  1 2   
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 15:48
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

Geändert von EWeiss (11. Jul 2019 um 15:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#2

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 15:56
Super, so zusammengeschustert klappt alles
Top

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

Vielen Dank an alle Beteiligten von meiner Seite nochmal

EDIT:
Eine Frage noch: Was mache ich jetzt, Free oder Destroy?
Und der direkte Aufruf von Destroy ist ja auch nicht StateOfTheArt besser wäre Free
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"

Geändert von Dunkelbunt27 (25. Jul 2012 um 16:00 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 16:00
Super, so zusammengeschustert klappt alles
Top

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

Vielen Dank an alle Beteiligten von meiner Seite nochmal
zusammengeschustert ? Hehehehe..
Im moment Destroy da unser alias noch nicht von der Classe selbst verwaltet wird.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#4

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 16:13
Zitat:
zusammengeschustert ? Hehehehe..
Ich versteh schon
FG Dunkelbunt
"Wer zuletzt lacht hat den höchsten Ping"
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 17:43
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 17:46
@Sir Rufo

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

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 19:43
Nur mit Free geht es so im moment nicht.
Wenn if assigned(myMCIPlayer) then myMCIPlayer.Destroy; geht, dann geht garantiert auch myMCIPlayer.Free; , denn rate mal was Free macht.

Wenn aber myMCIPlayer weiterhin verwendet wird, dann sollte man FreeAndNil(myMCIPlayer); verwenden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Syntax SendMCICommand

  Alt 25. Jul 2012, 20:11
Nur mit Free geht es so im moment nicht.
Wenn if assigned(myMCIPlayer) then myMCIPlayer.Destroy; geht, dann geht garantiert auch myMCIPlayer.Free; , denn rate mal was Free macht.

Wenn aber myMCIPlayer weiterhin verwendet wird, dann sollte man FreeAndNil(myMCIPlayer); verwenden.
Ging nicht..
Es beendet nicht die richitge Instanze über myMCIPlayer.Destroy('Player1');
Ich habe/hatte kein myMCIPlayer.Destroy;
Hättest du aber gesehen wenn du den älteren Quelltext angeschaut hättest..

destructor Destroy(alias: string); reintroduce;
Wenn zwei Intanzen des Player spielen würden wie willst du dann !NUR! mit Free
die richtige Instanz abhängig vom Alias beenden?
Zeig mir das mal ohne den alten Code zu ändern.

Mit dem neuen geänderten Code von Sir Rufo ist das jetzt kein problem mehr..

Zitat:
denn rate mal was Free macht.
Ich überlege gerade.. finde aber nicht die lösung was Free denn so macht.
Vielleicht doch besser Raten?

gruss

Geändert von EWeiss (25. Jul 2012 um 20:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Syntax SendMCICommand

  Alt 26. Jul 2012, 10:07
Nur mal so für Spaß eine Version, die sich den Alias selber erzeugt und somit wesentlich einfacher im Handling ist, da jede Instanz per Design einen eindeutigen Alias (GUID) bekommt.
Delphi-Quellcode:
unit uMciPlayer;

interface

uses
  Classes;

type
  TMciPlayerState = ( mpsClosed, mpsStopped, mpsPlaying, mpsPaused );

  TMciPlayer = class
  private
    FAlias : string;
    FState : TMciPlayerState;
    FDuration : Integer;
    FFileName : string;
    function GetPosition : Integer;
    procedure SetFileName( const Value : string );
    function GetState : TMciPlayerState;
    procedure SetState( const Value : TMciPlayerState );
  protected
    procedure DoCallCommand( const CmdStr : string ); overload;
    procedure DoCallCommand( const CmdStr : string; out ResultStr : string ); overload;

    procedure DoOpen;
    procedure DoClose;
  public
    constructor Create;
    destructor Destroy; override;

    procedure Open( const aFileName : string; aAutoPlay : Boolean = False );

    procedure Play;
    procedure Stop;
    procedure Pause;
    procedure Resume;

    property State : TMciPlayerState read GetState;
    property Duration : Integer read FDuration;

    property Position : Integer read GetPosition;

    property Alias : string read FAlias;
    property FileName : string read FFileName write SetFileName;

  end;

implementation

uses
  Winapi.MMSystem, System.SysUtils;

{ TMciPlayer }

constructor TMciPlayer.Create;
begin
  inherited Create;

  FState := mpsClosed;
  FAlias := GUIDToString( TGUID.NewGuid );
  FFileName := '';
  FDuration := 0;
end;

destructor TMciPlayer.Destroy;
begin
  DoClose;

  inherited;
end;

procedure TMciPlayer.DoCallCommand( const CmdStr : string );
var
  ResultStr : string;
begin
  DoCallCommand( CmdStr, ResultStr );
end;

procedure TMciPlayer.DoCallCommand( const CmdStr : string; out ResultStr : string );
var
  lResultCode : Cardinal;
  lResultSize : Cardinal;
  lReturn : array [0 .. 255] of WideChar;
begin
  lResultSize := 255;
  lResultCode := mciSendString( PWideChar( CmdStr ), lReturn, lResultSize, 0 );
  if lResultCode <> 0
  then
    begin
      mciGetErrorString( lResultCode, lReturn, 255 );
      raise Exception.CreateFmt( 'MCI-Fehler [%d] %s' + sLineBreak + '%s', [lResultCode, lReturn, CmdStr] );
    end;
  ResultStr := lReturn;
end;

procedure TMciPlayer.DoClose;
begin
  if State <> mpsClosed
  then
    begin
      DoCallCommand( 'close ' + FAlias + ' wait' );
      SetState( mpsClosed );
    end;
end;

procedure TMciPlayer.DoOpen;
var
  ResultStr : string;
begin
  if ( State = mpsClosed ) and ( FileName <> '' ) and ( Alias <> '' )
  then
    begin
      FDuration := 0;
      DoCallCommand( 'open "' + FFileName + '" alias ' + FAlias );

      DoCallCommand( 'set ' + FAlias + ' time format milliseconds wait' );
      DoCallCommand( 'status ' + FAlias + ' length wait', ResultStr );
      FDuration := StrToIntDef( ResultStr, 0 );
      SetState( mpsStopped );
    end;
end;

function TMciPlayer.GetPosition : Integer;
var
  ResultStr : string;
begin
  if State <> mpsClosed
  then
    begin
      DoCallCommand( 'status ' + FAlias + ' position wait', ResultStr );
      Result := StrToIntDef( ResultStr, 0 );
    end
  else
    Result := -1;
end;

function TMciPlayer.GetState : TMciPlayerState;
begin
  Result := FState;
end;

procedure TMciPlayer.Open( const aFileName : string; aAutoPlay : Boolean );
begin
  FileName := aFileName;
  if aAutoPlay
  then
    Play;
end;

procedure TMciPlayer.Pause;
begin
  if State = mpsPlaying
  then
    begin
      DoCallCommand( 'pause ' + FAlias + ' notify' );
      SetState( mpsPaused );
    end;
end;

procedure TMciPlayer.Play;
begin
  DoOpen;
  case State of
    mpsStopped :
      begin
        DoCallCommand( 'play ' + FAlias + ' notify' );
        SetState( mpsPlaying );
      end;
    mpsPaused :
      Resume;
  end;
end;

procedure TMciPlayer.Resume;
begin
  if State = mpsPaused
  then
    begin
      DoCallCommand( 'resume ' + FAlias + ' notify' );
      SetState( mpsPlaying );
    end;
end;

procedure TMciPlayer.SetFileName( const Value : string );
begin
  if Value <> FFileName
  then
    begin
      DoClose;
      FFileName := Value;
    end;
end;

procedure TMciPlayer.SetState( const Value : TMciPlayerState );
begin
  if Value <> FState
  then
    begin
      FState := Value;
    end;
end;

procedure TMciPlayer.Stop;
begin
  if State > mpsStopped
  then
    begin
      DoCallCommand( 'stop ' + FAlias + ' notify' );
      SetState( mpsStopped );
      DoCallCommand( 'seek ' + FAlias + ' to start notify' );
    end;
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Syntax SendMCICommand

  Alt 26. Jul 2012, 11:05
Zitat:
die sich den Alias selber erzeugt
Warum auch nicht
Die Frage .. Wie wirkt sich dieser lange string auf die Performance/Geschwindigkeit aus.

Bin immer noch mein Rad am drehen um zu erfahren was Free denn nun ist.

gruss

Geändert von EWeiss (26. Jul 2012 um 11:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 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