Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bass.dll - stereo zu mono (https://www.delphipraxis.net/141676-bass-dll-stereo-zu-mono.html)

Wishmaster 16. Okt 2009 20:27

Re: bass.dll - stereo zu mono
 
Hi

Pan kannst du einfach als Integer deklarieren
Delphi-Quellcode:
var Pan : Integer;

Procedure Set_Balance(Value : integer);
begin
 Pan:= Value;
end;

PanDSPProc16 bzw. PanDSPProc32 soll dir nur demonstrieren wie du BASS_ChannelSetDSP
benutzen kannst.

Mit BASS_ATTRIB_PAN kannst du die Balance eins channels einstellen.
leider funst diese Methode nicht mit einen Rec. Channel (BASS_RecordStart) und an der stelle
benutzt du dann PanDSPProc16 um die Balance einzustellen

Delphi-Quellcode:
Function Set_Balance(Value : integer) : Boolean;
var Pan : Float;
begin
   Pan:= Value / 100.0;
   Result := BASS_ChannelSetAttribute(Channel, BASS_ATTRIB_PAN, Pan) ;
 if not Result then
  // error
end;



PS. du kannst das das auch einfacher habe und zwar mit der bassmix.dll, das Problem ist das jede Eingabe (e.g. BASS_ATTRIB_PAN, BASS_ATTRIB_VOL,... ) verzögert sich um ~1..2 Sec.


Zitat:

If the mixer output is being played (it is not a decoding channel), then there will be some delay in the effect of adding/removing source channels or changing their attributes being heard. This latency can be reduced by making use of the BASS_CONFIG_BUFFER and BASS_CONFIG_UPDATEPERIOD config options. The playback buffer can be flushed by calling BASS_ChannelPlay (restart = TRUE) or BASS_ChannelSetPosition (pos = 0). That can also be done to restart a mixer that has ended.


ich hoffe das hat dir weiter geholfen.

Marco Steinebach 17. Okt 2009 17:41

Re: bass.dll - stereo zu mono
 
Hallo Wishmaster,
Joa, es hat mir weitergeholfen. Vielen Dank für die Spur, auf die du mich da gesetzt hast.
Und hier ist die Lösung:
Delphi-Quellcode:
procedure StereoToMono (handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
  P: pSingle; // zeiger auf ein Element des puffers.
  a: DWORD;
  mono, left, right: single;
begin
  P := buffer;
  a := 0;
  while (a < (length div 4)) do // 4 bytes pro eintrag (sizeOf single = 4)
  begin
    // erst kommt der linke Kanal
    left := p^;
    inc (p); // jetzt zeigt p auf den rechten
    right := p^;
    dec (p); // und wieder zurück zum linken, um ihn zu modifizieren
    mono := (left + right) / 2;
    p^ := mono;
    inc (p); // wir sind wieder beim rechten...
    p^ := mono;
    inc (p); // und beim nächsten zu bearbeitenden Sample
    a := a + 2; // weil zwei Samples verändert wurden.
  end;
end;

// und der Aufruf...
procedure TPlayer.MonoAbspielen (m: boolean);
begin
  if m then // mono abspielen
    MonoDSP := BASS_ChannelSetDSP (sh, @StereoToMono, nil, 1)
  else
    BASS_ChannelRemoveDSP (sh, MonoDSP);
end;
// wobei sh ein bei mir globaler Channel ist
// sh: HSTREAM;
Einen herzlichen Gruß
Marco

Marco Steinebach 13. Dez 2009 00:02

Re: bass.dll - stereo zu mono
 
... und da obige procedure eine Schutzverletzung verursachen konnte, und außerdem bei manchen Dateien geknackt hat, hier ddie richtige Lösung:
Delphi-Quellcode:
procedure StereoToMono (handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
var
  pl, pr: pSingle; // pl, pointer auf den linken Kanal, pr den rechten.
  a: DWORD; // Samplezaehler
  mono: single;
begin
  a := 1;
  length := length div SizeOf (single); // Length sind jetzt die Anzahl der Samples.
  pl := pSingle(buffer);
  pr := pSingle (Cardinal(buffer) + SizeOf(single));
  while a < length do
  begin
    mono := (pl^ + pr^) / 2;
    pl^ := mono;
    pr^ := mono;
    inc (pl, 2);
    inc (pr,2);
    a := a + 2; // weil zwei Samples verändert wurden.
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.
Seite 2 von 2     12   

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