Volume mit uos steuern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Volume mit uos steuern

Beitrag von mse »

Stefan67 hat geschrieben:Nach der 2 Sek. Pause ist aber jeweils immer wieder die volle Lautstärke da.
Kannst du das verifizieren?

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Volume mit uos steuern

Beitrag von Stefan67 »

So, oder?

Code: Alles auswählen

 
procedure TForm1.Button2Click(Sender: TObject);
begin
    uos_CreatePlayer(1);
    uos_AddFromFile(1,'/die_kurze_Einblendung.mp3'); ///////player 0 ist das Lied, player 1 die Einspielung
    uos_AddIntoDevOut(1);
    uos_AddDSPVolumeIn(0,0,1,1);         ///////////// hier, oder auch dort wo player 0 geladen wird - beides probiert mit gleichem Ergebnis
    uos_SetDSPVolumeIn(0,0,0.5,0.5,true);
    uos_Play(1);
    sleep(2000);
    uos_SetDSPVolumeIn(0,0,1,1,true);
end;   
Funktioniert bei einmaligem Durchgang. Beim zweiten Klick (Aufruf Button2Click) wird's noch leiser, usw.
Komisch ist auch, wenn ich in der vorletzten Zeile vor dem end; schreibe: uos_SetDSPVolumeIn(0,0,2,2,true); - wird das Lied außerhalb der Pause jedes mal lauter... :?
Zuletzt geändert von Stefan67 am So 14. Sep 2014, 16:47, insgesamt 1-mal geändert.

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Volume mit uos steuern

Beitrag von Stefan67 »

mse hat geschrieben:
Stefan67 hat geschrieben:Nach der 2 Sek. Pause ist aber jeweils immer wieder die volle Lautstärke da.
Kannst du das verifizieren?

Ich versuch's:
Musik spielt mit Lautstärke X
Button gedrückt: Musik spielt 2 Sekunden mit Lautstärke X/2
Musik spielt wieder mit Lautstärke X
Button noch mal gedrückt: Musik spielt 2 Sekunden mit Lautstärke X/4
Musik spielt wieder mit Lautstärke X
...

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Volume mit uos steuern

Beitrag von mse »

Stefan67 hat geschrieben:

Code: Alles auswählen

 
procedure TForm1.Button2Click(Sender: TObject);
begin
    uos_CreatePlayer(1);
    uos_AddFromFile(1,'/die_kurze_Einblendung.mp3'); ///////player 0 ist das Lied, player 1 die Einspielung
    uos_AddIntoDevOut(1);
//    uos_AddDSPVolumeIn(0,0,1,1);         ///////////// hier, oder auch dort wo player 0 geladen wird - beides probiert mit gleichem Ergebnis
<<<--- uos_AddDSPVolumeIn() darf nur einmal aufgerufen werden
 
Versuche das Programm auf das absolute Minimum zu reduzieren um die Funktion zu testen.
@Michl: Kannst du mal deinen Code zeigen?
Stefan67 hat geschrieben: Komisch ist auch, wenn ich in der vorletzten Zeile vor dem end; schreibe: uos_SetDSPVolumeIn(0,0,2,2,true); - wird das Lied außerhalb der Pause jedes mal lauter...
Das ist nicht komisch, 2*2=4. ;-)

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Volume mit uos steuern

Beitrag von Michl »

Code: Alles auswählen

TForm1 = class(TForm)
...
  private
    procedure ClosePlayer1;
  public
  end;
 
...
 
procedure TForm1.Button1Click(Sender: TObject);             //Startet Hintergrundmusik
begin
  if uos_GetStatus(0) = -1 then begin
    uos_CreatePlayer(0);
    uos_AddIntoDevOut(0);
    uos_AddFromFile(0, pchar('1.mp3'));
    uos_AddDSPVolumeIn(0, 0, 1, 1);
    uos_Play(0);
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);             //Abspielen eines kurzen Wavs
var
  PlayerIndex1: Integer;
begin
  PlayerIndex1 := 1;
  if uos_GetStatus(0) = 1 then
    if uos_GetStatus(1) < 1 then
      begin
        uos_CreatePlayer(PlayerIndex1);
        uos_AddIntoDevOut(1);
        uos_AddFromFile(1, 'tada.wav');
        uos_EndProc(PlayerIndex1, @ClosePlayer1);
        uos_SetDSPVolumeIn(0, 0, 0.1, 0.1, True);
        uos_Play(PlayerIndex1);
      end
    else
      ShowMessage('Bitte warten, bis Sound zu Ende!')
  else
    ShowMessage('Keine Hintergrundmusik, bitte zuvor starten!');
end;
 
procedure TForm1.ClosePlayer1;                              //Lautstärke wieder auf normal setzen
begin
  uos_SetDSPVolumeIn(0, 0, 1, 1, True);
end;
[Edit]: habe mal den Timer rausgeschmissen, es gibt auch ein EndProc.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Volume mit uos steuern

Beitrag von Stefan67 »

Super! Jetzt hab ich's! :D

Erstmal, jedenfalls. Im nächsten Schritt möchte ich, dass das Lied während der Einspielung aus- und wieder eingeblendet wird. Und die "Ruhezeit" soll sich automatisch an der Dauer der Einspielung orientieren. Weiß jemand aus'm Stegreif, wie ich die Länge einer Audio-Datei auslesen kann?

Ich hoffe ich habe mir da nicht zu viel vorgenommen. Aber dafür habe ich ja euch. :wink: Jedenfalls Danke!

Der Vollständigkeit halber hier noch mein erfolgreicher Code:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
 
interface
 
uses
    uos_flat, Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
    Dialogs, StdCtrls, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  playing: boolean;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  In1Index, Out1Index, PlayerIndex1: integer;
     begin
         PlayerIndex1 := 0;
if  playing=false  then
begin
    uos_CreatePlayer(PlayerIndex1);
    In1Index := uos_AddFromFile(PlayerIndex1, PChar('/Pfad_zum_Lied'), -1, 0, -1);
    Out1Index := uos_AddIntoDevOut(PlayerIndex1, -1, -1, uos_InputGetSampleRate(PlayerIndex1, In1Index), -1, 0, -1);
    playing:=true;
    uos_AddDSPVolumeIn(0,0,1,1);
    uos_Play(PlayerIndex1);
end else
begin
  uos_Stop(0);playing:=false;
  end;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    uos_CreatePlayer(1);
    uos_AddFromFile(1,'/Pfad_zur_kurzen_Einspielung');
    uos_AddIntoDevOut(1);
    uos_SetDSPVolumeIn(0,0,0.4,0.4,true);
    uos_Play(1);
    Timer1.Enabled := true;
   end;
 
procedure TForm1.Button3Click(Sender: TObject);
     var ordir: string;
begin
    ordir := application.Location;
  showmessage (ordir);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var ordir: string;
begin
  playing:=false;
  if uos_LoadLib(
    Pchar(ordir + 'lib/Linux/64bit/LibPortaudio-64.so'),
    Pchar(ordir + 'lib/Linux/64bit/LibSndFile-64.so'),   
    Pchar(ordir + 'lib/Linux/64bit/LibMpg123-64.so'),
    Pchar(ordir + 'lib/Linux/64bit/LibSoundTouch-64.so') 
    ) = 0 then
{$else}
  if uos_LoadLib(
    Pchar(ordir + '/lib/Linux/32bit/LibPortaudio-32.so'),
    Pchar(ordir + '/lib/Linux/32bit/LibSndFile-32.so'),      
    Pchar(ordir + '/lib/Linux/32bit/LibMpg123-32.so'),
    Pchar(ordir + '/lib/Linux/32bit/LibSoundTouch-32.so')  
    ) = 0 then
{$endif}
 
 
end;
 
 
procedure TForm1.FormDestroy(Sender: TObject);
  begin
    uos_unloadlib();
  end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
  begin
    uos_SetDSPVolumeIn(0,0,1,1,true);
    Timer1.Enabled:= false;
  end;
 
end. 
 

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6776
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Volume mit uos steuern

Beitrag von af0815 »

Aus dem Stehgreif - Google verwenden - Keys: mp3 dauer auslesen pascal
http://www.delphipraxis.net/151826-tite ... lesen.html

oder mit Beispiel

http://www.delphi-treff.de/tipps-tricks ... ermitteln/
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Volume mit uos steuern

Beitrag von Michl »

Stefan67 hat geschrieben:Weiß jemand aus'm Stegreif, wie ich die Länge einer Audio-Datei auslesen kann?
Du kannst, nachdem Du das Soundfile geladen hast, dessen Länge in Sekunden mit z.B. uos_InputLengthSeconds(PlayerIndex1, 0) bestimmen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Volume mit uos steuern

Beitrag von Stefan67 »

@af0815
Danke für den Link. Den merke ich mir!
Michl hat geschrieben:
Stefan67 hat geschrieben:Weiß jemand aus'm Stegreif, wie ich die Länge einer Audio-Datei auslesen kann?
Du kannst, nachdem Du das Soundfile geladen hast, dessen Länge in Sekunden mit z.B. uos_InputLengthSeconds(PlayerIndex1, 0) bestimmen.
var
Dauer: single;

Dauer:= uos_InputLengthSeconds(1,0);

Richtig so?
Funktioniert, aber der Wert ist nicht plausibel. :?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Volume mit uos steuern

Beitrag von Michl »

Stefan67 hat geschrieben:Funktioniert, aber der Wert ist nicht plausibel. :?
Wenn Du diesen Wert für die Timersteuerung nutzen willst, müsstest Du:

Code: Alles auswählen

        Timer1.Interval:=Round(uos_InputLengthSeconds(PlayerIndex1, 0) * 1000);
rechnen. Der Rückgabewert der Funktion ist in Sekunden, nicht Millisekunden!

Falls Du das Fadein nach dem Ende des Sounds machen willst, würde ich aber statt einem Timer lieber die Funktion EndProc (siehe Bsp. oben, ist wie ein Ereignis verwendbar) nutzen!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Volume mit uos steuern

Beitrag von Stefan67 »

Hm, uos_InputLengthSeconds gibt mir den Wert 42.126... zurück, dieMP3 läuft 10 Sek., laut Mediaplayer.

EndProc funktioniert, aber da die Datei fast nur die ersten 3 Sek hörbar ist (der Rest Ausklingen und Rauschen), sind beide Varianten nicht immer passend. Vielleicht doch besser von Hand anpassen?

Egal, ich weiß jetzt wie's geht, hab' viel gelernt und für heute genug - vielen Dank an alle! :wink:

Antworten