Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 03.06.10 01:41 
Hey,

ich such zur Zeit nach ner Lösung für folgendes Problem:
Ich will den Sound eines Programms (Firefox) abfangen, weil er bloß über den Front-Channel läuft. Den abgefangenen Stream will ich dann auf alle Boxen des Soundsystems legen. Leider hab ich bei google & Co kein Programm dafür gefunden, also hab ich mir vorgenommen sowas mal zu schreiben (vorrausgesetz ich bekomm das hin^^) Hat jmd von euch ne Idee, wie man sowas realisieren kann?

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 05.06.10 04:10 
Hey,

ich bin grad dabei miene Idee in die Tat umzusetzn, aber es will nich so ganz wie ich will. Ich versuch das ganze mit der Bass.dll. Ich hab mir nen record Stream besorg un erstma versucht Daten aufzuzeichnen und wieder abzuspielen, aber da scheiter ich schon. Hier ma der Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//AUFNAHME
function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
begin
  FileStream.Write(buffer, length);
  Result := True;
end;

//InputStream erzeugen 
i := 0;
InputDevice := 0;
while BASS_RecordSetInput(i, BASS_INPUT_OFF, -1do i := i + 1;            //alle abschalten
BASS_RecordSetInput(InputDevice, BASS_INPUT_ON, 1);
RecStream:= BASS_RecordStart(4410020, @RecordingCallback, 0);          //Stream erzeugen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
//WIEDERGABE
function Callback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
begin
  if MemStream.Position + Length > MemStream.Size then begin
    result := false;
  end else begin
    FileStream.Read(buffer, Length); 
    FileStream.Position := MemStream.Position + Length;
    Result := True;
  end;
end;

PlayStream := Bass.BASS_StreamCreate(4410020, @Callback, 0);
BASS_ChannelPlay(PlayStream , false);

Die aufnahme Funktionniert soweit ich das erkennen kann. Ich lass mir zum überprüfen die FFT-Daten des record-Stream ausgeben und in der Datei stehen auch Daten drin (leider kann ich die nich mit dem WMP anhören oder so).
Bei der Widergabe passiert gar nix, aber ich weiß nich warum. In der Bass-Hilfe wurde das auch so gemacht. Kann mir da jmd helfen?

€: ich habs jetz so weit, das ich ein total verzerrtes abspielen des Streams habe. Das Problem ist, das ich die Daten nciht wieder zusammensetzen kann. Die liegen im WAV-Format vor un da steht in der Doku, das die Block größe Channels * ( Samplerate / 8 ) ist. Bei mir wären das 4 Byte/Block. Wenn ich die Daten jetzt aber wie folgt auslesen will, dann hab ich dieses verzerrte Signal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function Callback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall;
var
  buf: ^DWord;
  i, len: Integer;
begin
  buf := buffer;
  len := Length div 4;
  for i := 0 to len - 1 do begin
    MemStream.Read(buf^, 4);
    inc(buf);
  end;
  Result := True;
end;


MfG & Thx Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 05.06.10 13:30 
Hi, leider habe ich wenig Zeit, bin nicht zu Hause!
Bin aber selber am schreiben von sowas. Problem ist leider das die Wiedergabe nicht direkt, wie bei inetradio, gestreamt wird!
Also muss man über, Master oder Lineout(FrontLP) gehen, falls ich das richtig verstanden habe bei Dir!? Nun kann man aber nicht gleichzeitig ! Aufnehmen und wiedergeben. Da Du ja das gleiche Singal, wiedergabe FireFox z.B. Lineout(FrontLP) und wiedergabe Deines Records ebenfalls Lineout(FrontLP) machst!
FireFox kannst Du nicht sagen wo er das Singal hinschicken soll, im allg. FrontLP! Dein Rec/Wiedergabe aber schon, z.B RearLP.
Kongret!
In der BassInizialisierung musst Du die Speakerabfrage machen welche er überhaupt findet! Nur so kannst Du auch eine Trennung durchführen!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
var i: BASS_INFO;
.......
.......
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
   begin
       MessageBox(0'An incorrect version of BASS.DLL was loaded'nil, MB_ICONERROR);
     Halt;
   end;

   if not BASS_Init(-1441000, Handle, nilthen
      Error('Error initializing audio!');

   BASS_GetInfo(i);
  
   if (i.speakers < 4then // no extra speakers detected, enable them anyway?
   begin
       if (MessageBox(0'Lautsprecher Zuordnung trotzdem aktivieren?''Keine extra Lautsprecher gefunden', MB_ICONQUESTION or MB_YESNO) = IDYES) then
       begin
        // reinitialize BASS - forcing speaker assignment
           BASS_Free;
           if (not BASS_Init(-144100, BASS_DEVICE_SPEAKERS, Handle, nil)) then
           begin
               MessageBox(0'Can''t initialize device'nil0);
               Halt;
           end;
           BASS_GetInfo(i); // get info again
       end;
   end;

Wird Dir aber sicherlich bekannt sein :wink:
Bei der Aufnahme solltest Du auch nicht gleich mit Volume 1, sondern mit 0,5 anfangen, und dann evtl höher gehen wenn das Signal nicht laut genug ist.
Wie gesagt! Wichtig ist die Trennung von den beiden Signalen, FirerFox und Dein Rec/WiedergabeSignal.
Ob ich richtig damit bin, bezogen auf Deine Info, kann ich nicht genau sagen, hoffe es aber!?

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 05.06.10 16:46 
Hey,

den WiedergabeStream bekomm ich ohne Probleme auf die hinteren Boxen, woran ich grad scheiter, ist nur von den 2 vorderen Boxen aufzunehmen. Er nimmt immer den kompletten Soundausgang auf, un da die Wiedergabe leicht Zeitversetzt ist bekomm ich jedesmal ein Echo rein. Und ich hab bis jetzt auch nix gefunden, wie ich den RecordStream so initialisieren kann, das er nur die vorderen Boxen aufnimmt.

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 06.06.10 12:09 
Jo, ist auch richtig so :wink:
FrontLP = Linout und kann so nicht für die Aufnahme genutzt werden.(nicht umschaltbar)
RearLP = LineIn also Aufnahmemöglichkeit!
Center = Microeingang also auch Aufnahmemöglichkeit!(Mono und empfindlicherer Eingang)
Je nach Soundkarte noch(7.1 System)
Site = Lineout.(nicht umschaltbar)!
Ich weiss jetzt zwar nicht was Du oder warum Du mit FireFox "aufnehmen" willst, aber versuch doch mal das was Du abspiellst als Inetstream zu machen, so hast Du alle Ausgänge frei und kannst das Signal auf die LPausgänge schicken!
Hier, oder in einem anderen Delphi Forum, habe ich den Code für sowas schon gesehen. Glaube das war sogar ein Tutorial für ein PLayer mit Bass.Dll!

muss wieder weg mist
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: So 06.06.10 19:15 
Hey,

ich komm drad nich ganz mit^^ Die Aufnahmegeräte, die die Bass.dll mir anzeigt sind folgende:
0 - Mono Mix
1 - Stereo Mix
2 - Aux
3 - CD-Player
4 - Line-In
5 - Mikrofon
6 - Telefonleitung
Die einzigen wo ein Signal ankommt sind 0 und 1. Bei den anderen is funkstille.
Und ich möchste nicht MIT dem Firefox aufnehmen, sondern ich möchste den Sound VOM Firefox aufnehmen, damit der Sound bei Youtube und Co auf dem ganzen SoundSystem läuft und nicht nur auf den Front-Boxen...

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 06.06.10 21:51 
Ok, kurz zur Erklärung.
0 = Monomix (Veraltet) ist für 2,5 und 6 gedacht. Dort wird auch das StereoSignal aufgespielt, als Monowiedergabe.
1 = StereoMix, sind alle Stereo AudioSignale die Du abspielen kannst. Incl. LineIn(4) und Micro(5)
2 = Aux (veraltet).
3 = CD (Veraltet) Wurde früher verwendet um das AudioSignal des PC - CD/DVDPlayer/Recorder direkt mit dem Board zu verbinden.
4 = LineIn. klar 8) Dort kann man einen externen CDPlayer anschliessen z.B. Liegt hier nichts an kannst Du auch nichts aufnehmen.
5 = Micro Eingang. Hier das gleiche wie bei 4.
6 = (veraltet) gibt es eigentlich gar nicht mehr.

Ältere Soundkarten mit 3 Anschlüssen, aber 5.1 Wiedergabe schalten 4 und 5 um als WiedergabeSignal!
Hatt aber nix mit der eigentlichen Sache zu tun.

Bleibt also nur der Stereomix(1) und Monomix(0) für die Aufname übrig!

Beispiel: Du schaust/hörst Dir mit NeroShowtime ne DVD an und hörst zur gleichen Zeit mit dem Mediaplayer Mp3 an.
Beides kannst Du über die Software einzeln in der Lautstärke regeln, gehen aber trotzdem gemeinsam auf den StereoMix :wink: Demzufolge auch alles, was Du über Firefox anhörst.
Darum mein Vorschlag: Das ganze als Inetstream zu machen.
Nur find ich es leider auch nicht mehr, wie dies genau gemacht wird. Irgendwie war das so, glaube ich!?
ausblenden Delphi-Quelltext
1:
stream=BASS_StreamCreateURL('http://www.welchesite.com/file.mp3'00, NULL, 0);					

Wie das mit YouTube funct mh.....
Der rest ist dann ja nur noch die Zuordnung bei der Wiedergabe, welche Speaker Du ansprechen willst!
Ist die zweite '0' bei den Parametern.
Damit würdest Du das Signal nicht erst auf LineOut schicken und auf den Stereomix, dann recorden und wieder zurück. Zeitversetzt und evtl. mit schlechterer Qualität.
Mh... verdammt kompliziert das richtig zu erklären :?

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mi 09.06.10 11:52 
Hi user profile iconBergmann89.
Bei mir wird z.B nur noch folgendes Angezeigt:
0=Line-Lautstärke
1=Front-Micro
2=Rear_Micro
3=StereoMix
Du siehst, die Angaben sind von der jeweiligen Board/Soundkarte abhängig.
Da kein anderer ne Idee hat, versuche ich nochmal was einzubringen. Ob dies allerdings sinnvolle Lösungen sind? (Aufwand und Nutzen)

Da dies ja Videos sind gehts natürlich nicht mit der bass.dll oder so wie Du es machen wolltest!
Zwei Möglichkeiten sehe ich da eigentlich nur.
1. Du biegst die AudioAusgabe von Firefox um, auf Dein Prog. Machbar ist alles, aber frag mich nicht wie :gruebel:
2. Du schreibst Dir mit der BassVideo.dll/Bass.Dll so eine art Realplayer.

Egal wie man es anstellt, Frage bleibt, Nutzen und Aufwand!

Persöhnlich würde ich für das 2. plädieren. Kann man sich richtig reinsteigern was vernünftiges zu machen!
Siehe "Nemp-Noch ein MP3-Player" von user profile iconGausi !

Tut mir leid, das ich nicht weiter Helfen konnte.

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 09.06.10 13:19 
Hey,
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
1. Du biegst die AudioAusgabe von Firefox um, auf Dein Prog. Machbar ist alles, aber frag mich nicht wie :gruebel:
Das war ja von Anfang an meine Idee^^ Ich hab mir das auch iwie leichter vorgstellt...
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
2. Du schreibst Dir mit der BassVideo.dll/Bass.Dll so eine art Realplayer.
für sowas Großes hab ich zur Zeit keine Zeir, leider. Also werd ich das Ganze erstmal ruhen lassen, bis mir was besseres einfällt...
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Tut mir leid, das ich nicht weiter Helfen konnte.
Kein Ding, schließlich zählt der Wille ;)

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^