Kannst du das verifizieren?Stefan67 hat geschrieben:Nach der 2 Sek. Pause ist aber jeweils immer wieder die volle Lautstärke da.
Volume mit uos steuern
-
- 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
-
- 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
So, oder?
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...
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;
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.
-
- 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
mse hat geschrieben:Kannst du das verifizieren?Stefan67 hat geschrieben:Nach der 2 Sek. Pause ist aber jeweils immer wieder die volle Lautstärke da.
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
...
-
- 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
Versuche das Programm auf das absolute Minimum zu reduzieren um die Funktion zu testen.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
@Michl: Kannst du mal deinen Code zeigen?
Das ist nicht komisch, 2*2=4.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...

Re: Volume mit uos steuern
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;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- 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
Super! Jetzt hab ich's!
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.
Jedenfalls Danke!
Der Vollständigkeit halber hier noch mein erfolgreicher Code:

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.

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.
- 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
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/
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).
Re: Volume mit uos steuern
Du kannst, nachdem Du das Soundfile geladen hast, dessen Länge in Sekunden mit z.B. uos_InputLengthSeconds(PlayerIndex1, 0) bestimmen.Stefan67 hat geschrieben:Weiß jemand aus'm Stegreif, wie ich die Länge einer Audio-Datei auslesen kann?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- 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
@af0815
Danke für den Link. Den merke ich mir!
Dauer: single;
Dauer:= uos_InputLengthSeconds(1,0);
Richtig so?
Funktioniert, aber der Wert ist nicht plausibel.
Danke für den Link. Den merke ich mir!
varMichl hat geschrieben:Du kannst, nachdem Du das Soundfile geladen hast, dessen Länge in Sekunden mit z.B. uos_InputLengthSeconds(PlayerIndex1, 0) bestimmen.Stefan67 hat geschrieben:Weiß jemand aus'm Stegreif, wie ich die Länge einer Audio-Datei auslesen kann?
Dauer: single;
Dauer:= uos_InputLengthSeconds(1,0);
Richtig so?
Funktioniert, aber der Wert ist nicht plausibel.

Re: Volume mit uos steuern
Wenn Du diesen Wert für die Timersteuerung nutzen willst, müsstest Du:Stefan67 hat geschrieben:Funktioniert, aber der Wert ist nicht plausibel.
Code: Alles auswählen
Timer1.Interval:=Round(uos_InputLengthSeconds(PlayerIndex1, 0) * 1000);
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;
-
- 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
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!
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!
