Entwickler-Ecke

Multimedia / Grafik - Bass.dll - Lautstärke ermitteln


beastofchaos - Sa 21.05.11 22:45
Titel: Bass.dll - Lautstärke ermitteln
Hallo Leute,
seit Lägerem befasse ich mich nun mit der Bass.dll. Nun will ich bei meinem Progamm auch die Lautstärke regulieren. 2 Probleme:

Wie ermittel ich die Lautsträke - habe die bass-unit durchgeschaut und die Funktion BASS_GetVolume gefunden. Die gibt aber iwie nur "-1" aus... Wisst ihr da was?

2.Problem: Ich habe im Hintergrund per Media player ein Lied laufen, will aber die Lautstärke des Programms verringern - nicht "global" auf dem ganzen Computer und damit auch meine Musik im Hintergrund. Wenn ich aber BASS_SetVolume() benutze, passiert genau das... Nämlich alles wird leiser :/

Hoffe auf Hilfe, Gruß Thomas ;)


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 21.05.2011 um 23:31


glotzer - Sa 21.05.11 22:57

naja, wenn dann musst du ALLES mit der bass.dll machen, oder eben garnix


beastofchaos - Sa 21.05.11 23:20

Na klar mach ich alles mit der Bass.dll, aber was ich doof finde, dass sich das auch auf andere Programm (wie den Windows Meda Player) auswirkt...

Außerdem geht das mit GetVolume inzwischen - war, glaub ich, vor dem LoadBass ^^


glotzer - Sa 21.05.11 23:47

oh, sorry hat sich so angehört als würdest du mit dem mediaplayer im programm was abspielen


beastofchaos - Sa 21.05.11 23:57

:))

So, ich hab noch ein Problem - die Bass.dll mag mich nicht^^

Ich hab einen Button zum Musik pausieren eingebaut. Quelltext sieht so aus:

Delphi-Quelltext
1:
2:
if (Bass_ChannelIsActive(FBackgroundStream) = BASS_ACTIVE_PLAYING) then
    BASS_Pause;


Das ist alles - Musik stoppt sogar, aber das Programm hängt sich automatisch auf - auch ohne die Abfrage... :/


ALF - Sa 21.05.11 23:58

Hast Du ja schon gefunden getvolume und das andere ist setvolume
die werte sind 0 bis 1. also 0,001 ist leise 0,5 ist die halbe lautstärke
Genauer gesagt:

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  volume: real; //<--wert von 0 bis 1, also 0.001 bis 1 zb.

BASS_ChannelGetAttribute(FBackgroundStream, BASS_ATTRIB_VOL, Volume)
BASS_ChannelSetAttribute(FBackgroundStream, BASS_ATTRIB_VOL, volume)

Pause ist

Delphi-Quelltext
1:
Bass_ChannelPause(FBackgroundStream), wenn ich mich recht erinnere.                    


Gruss ALf


glotzer - So 22.05.11 00:20

[eigenwerbung]http://www.delphi-forum.de/viewtopic.php?t=105549 [http://www.delphi-forum.de/viewtopic.php?t=105549][/eigenwerbung]


ALF - So 22.05.11 00:31

user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
[eigenwerbung][url=http://www.delphi-forum.de/viewtopic.php?t=105549]http://www.delphi-forum.de/viewtopic.php?t=105549[/url][/eigenwerbung]
Oh ja, da wollte ich auch noch nen Vorschlag machen :wink:

@beastofchaos:
Ansonsten gibt es Die Bass-Help und die Bass-Demos. Sollte man sich unbedingt anschauen!
Vielleicht hilft auch das http://www.delphi-treff.de/tutorials/sonstiges/mein-einfacher-mp3-player/ueberblick-und-vorbereitung/

Ansonsten gibt es sehr viele Infos auch hier im Forum, wenn man mal die Suche benutzt :wink:

Gruss ALf


beastofchaos - So 22.05.11 00:43

Werde ich mir morgen auf jeden Fall mal durchlesen ( das Tut zu bass.dll ).

@Glotzer: Hab grad deinen Thread zur eigenen Bass-Klasse angeschaut - in deiner procedure Pause - siehts auch so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TBassSound.Pause;
begin
  if Handle = 0 then NotLoadedError;
  BASS_ChannelPause(Handle);
  BassError(BASS_ErrorGetCode);
end;


Bloß funktioniert bei mir Pause und auch ChannelPause nicht - also würd mir deine Prozedur auch iwie nichts bringen - vermut ich... :/ was mach ich falsch...-_-

Gruß


ALF - So 22.05.11 00:47


Delphi-Quelltext
1:
Bass_ChannelPause(FBackgroundStream);                    

damit geht dein aktueller Straem/handel, Sound in die Pause!


Delphi-Quelltext
1:
Bass_ChannelPlay(FBackgroundStream);                    

spielst Du ihn wieder ab!

Gruss alf


beastofchaos - So 22.05.11 01:03

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
Bass_ChannelPause(FBackgroundStream);                    

damit geht dein aktueller Straem/handel, Sound in die Pause!


Delphi-Quelltext
1:
Bass_ChannelPlay(FBackgroundStream);                    

spielst Du ihn wieder ab!

Gruss alf


Das ist mir doch klar - Mir gehts doch darum, dass mein Programm sich aufhängt, wenn ich diese Prozedur aufrufe... :/


glotzer - So 22.05.11 01:09

spielst du einen stream aus dem Netz ab? falls ja musst du Bass_ChannelStop nehmen.


ALF - So 22.05.11 01:11

BASS_Pause();
Stops the output, pausing all musics/samples/streams
Return value
If successful, then TRUE is returned, else FALSE is returned. Use BASS_ErrorGetCode to get the error code.

Hst Du auch die Errrorbehandlung mit eingebaut?
Sieht ja so aus das bei der inizialisierung was nicht stimmt!

Währe also mehr infos wichtig!
Alles andere ist Raten.

Gruss ALf


beastofchaos - So 22.05.11 01:20

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
BASS_Pause();
Stops the output, pausing all musics/samples/streams
Return value
If successful, then TRUE is returned, else FALSE is returned. Use BASS_ErrorGetCode to get the error code.

Hst Du auch die Errrorbehandlung mit eingebaut?
Sieht ja so aus das bei der inizialisierung was nicht stimmt!

Währe also mehr infos wichtig!
Alles andere ist Raten.

Gruss ALf


@glotzer: Also, ich spiel ganz normal aus einem Unterordner ein Lied ab - kA, was du sonst mit Netz meisnt :P

@ALF: Plötzlich geht bei mir ChannelPlay - das ich bei PLAY eine Errorbehandlung brauche - ist ja ätzend xD

Da werd ich wohl lieber jeden einzelnen Stream pausieren, da es jetzt geht ;) Morgen werdet ihr wieder von mir höen, weil ich dann das nächste Problem mit Dateien kopieren habe xD
(CopyFile funktioniert nicht trotz richtiger Pfade)


Gute Nacht ;)


ALF - So 22.05.11 01:31

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
@ALF: Plötzlich geht bei mir ChannelPlay - das ich bei PLAY eine Errorbehandlung brauche - ist ja ätzend xD
Darum auch die Bass-Hilfe nehmen. hat schon seinen Grund!

Bool BASS_ChannelPlay(DWORD handle, BOOL restart);

Zitat:
Return value
If successful, TRUE is returned, else FALSE is returned. Use BASS_ErrorGetCode to get the error code.

Error codes
BASS_ERROR_HANDLE handle is not a valid channel.
BASS_ERROR_START The output is paused/stopped, use BASS_Start to start it.
BASS_ERROR_DECODE The channel is not playable, it's a "decoding channel".
BASS_ERROR_BUFLOST Should not happen... check that a valid window handle was used with BASS_Init.
BASS_ERROR_NOHW No hardware voices are available (HCHANNEL only). This only occurs if the sample was loaded/created with the BASS_SAMPLE_VAM flag and BASS_VAM_HARDWARE is set in the sample's VAM mode, and there are no hardware voices available to play it.

Ich glaube das sagt alles Warum man es machen soll!

Gruss ALf


beastofchaos - Mo 23.05.11 20:24

Ihr wisst ja, dass ich das Problem auch mit Bass_Stop habe. Ich dachte, ich könnte das Problem auch mit Bass_ChannelStop lösen - leider hängt sich das Programm wieder auf.

Muss ich bei ChannelStop vll. auch eine Fehlerbehandlung mitführen? Und wie würde das dann z.B. aussehen?


edit:

Ok, Problem geklärt - ein Timer versucht dann nämlich das Lied abzuspielen und wenn die gegen arbeiten, kann das nur hängen xD Dazu fällt mir aber auf, dass kein Utnerschied ziwschen ChannelStop und ChannelPlay liegt. Wie kann ich denn das Lied auf Sekudne 0 setzen?


ALF - Mo 23.05.11 21:38

Ich will ja nicht unhöfflich sein, aber hast Du nun die BASS-Hilfe oder nicht!?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
position: QWORD;


position:= BASS_ChannelGetPosition(FBackgroundStream, BASS_POS_BYTE);//<--lesen der Position


BASS_ChannelSetPosition(FBackgroundStream, position, BASS_POS_BYTE);//<--setzten der Position


user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
...ein Timer versucht dann nämlich das Lied abzuspielen und wenn die gegen arbeiten, kann das nur hängen xD Dazu fällt mir aber auf, dass kein Utnerschied ziwschen ChannelStop und ChannelPlay liegt.


Wieso spielt ein Timer deine Sounds ab????

Was für ein unterschied??

ChannelStop, stoppt die Musik
ChannelPlay startet die Musik

Warum soll das kein unterschied sein????
Gruss ALf


beastofchaos - Mo 23.05.11 21:50

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Ich will ja nicht unhöfflich sein, aber hast Du nun die BASS-Hilfe oder nicht!?

Wieso spielt ein Timer deine Sounds ab????

Was für ein unterschied??

ChannelStop, stoppt die Musik
ChannelPlay startet die Musik

Warum soll das kein unterschied sein????
Gruss ALf


Mit einem Timer prüfe ich, ob das Lied zu Ende ist und für den Fall wird per Random ein neues Lied gestartet.

Naja, mit ChannelPause kann ich auch pausieren xD meinte natürlic hden Utnerschied zwischen Stop und Pause. Und danke für die Prozedur und nein, ich habs heute ncoht nciht geschafft. Ich werd jetzt zu dem Thema nur etwas fragen, wenn ich die schon durchgelesen habe, ok? :)


ALF - Mo 23.05.11 22:09

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Naja, mit ChannelPause kann ich auch pausieren xD meinte natürlic hden Utnerschied zwischen Stop und Pause.

Basshilfe
Zitat:

Stopping a user stream (created with BASS_StreamCreate) will clear its buffer contents. Use BASS_ChannelPause instead if you wish to stop a user stream and then resume it from the same point.

Ich kann so gut wie kein engl und habs verstanden das es da ein Unterschied gibt :wink:
Warum sollte es da also keinen Unterschied geben?
Gruss ALf


beastofchaos - Mo 23.05.11 22:20

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Naja, mit ChannelPause kann ich auch pausieren xD meinte natürlic hden Utnerschied zwischen Stop und Pause.

Basshilfe
Zitat:

Stopping a user stream (created with BASS_StreamCreate) will clear its buffer contents. Use BASS_ChannelPause instead if you wish to stop a user stream and then resume it from the same point.

Ich kann so gut wie kein engl und habs verstanden das es da ein Unterschied gibt :wink:
Warum sollte es da also keinen Unterschied geben?
Gruss ALf



Das "resume it from the same point" macht aber auch ChannelStop, was mich halt verwirrt hat :) Kennst du doch sicher von Mediaplayer oder so, dass wenn du auf Stop (das Viereck) klickst, das Lied auf 0:00 zurück gestzt wird, aber das kann ich logisch auch manuell machen, also kein Problem mehr ;)