![]() |
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:
ich hoffe das hat dir weiter geholfen. |
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:
Einen herzlichen Gruß
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; Marco |
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. |
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