Einfacher sound recorder für .NET

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    vielen Dank für den Tip mit dem NUGET Installer. Jetzt verstehe ich, worum es sich da handelt.

    Aber trotzdem möchte ich jetzt erst mal klären, wieso der Import bei mir nicht zu funktionieren scheint. Offensichtlich ist da etwas grundlegend falsch ... bei anderen scheint das ja problemlos zu funktionieren.

    Ich hoffe sehr, dass mir jemand helfen kann. Denn das Code Sample sollte genau das tun, was ich vorhabe! Ich hoffe, ihr verliert nicht die Geduld mit mir ...

    LG
    Peter

    petaod schrieb:

    Da werden alle Abhängigkeiten geladen.
    Da bin ich mir nicht ganz sicher.
    Hier
    un4seen.com/bass.html
    sind eine ganze Menge weitere bassXXX-DLLs gelistet, ich glaube nicht, dass die alle dort verwiesen sind.
    @Peter329 Dort kannst Du alle benötigten DLLs in einer gemeinsamen Version runterladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Peter329 schrieb:

    wieso der Import bei mir nicht zu funktionieren scheint.


    Ich weis nicht was du nun alles schon probiert hast. Pack dir das BassNet SDK in einen Ordner im System wo du LIBS hast die du immer wieder verwendest, im Projekt verweise NUR auf die BassNet. Das ist der NET-Wrapper für die ganzen nativen BASS-Dlls(inkl. Addons). Wenn du den Verweis auf die BassNet gemacht hast, nur noch die nativen DLLs in die Ausgabeordner kopieren, mehr ist nicht zu machen. Achte auf die richtige Architektur(x86/x64), solltest du die falche Archtektur kopiert haben, müsstest du irgendeine Fehlermeldung mit BadImage oder so bekommen.

    PS.
    Ich habe die nativen DLLs immer im Projektordner, füge aber eine Buildaufgabe hinzu(xcopy), so das immer vorm Build die DLLs kopiert werden. So braucht man von Hand nur an einen Ort kopieren, statt in jeden Ausgabeordner und hat wenn man richtig gemacht hat, auch immer die richtige DLL(x64/x86) im Ausgabeordner. Aber mach erstmal "Level 1".
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    @All Ich habe das von @DTF in Post #9 verwiesene Projekt zum Laufen gebracht,
    mit allen DLLs frisch geladen auf der in Post #22 verlinkten Seite.
    Allerdings bringt mir BassEnc.BASS_Encode_Start() den Fehler BASSError.BASS_ERROR_HANDLE bei allen angezeigten Input-Geräten.
    Hat da jemand einen Rat für mich?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich probiere das Projekt nachdem Mittagessen mal aus, ich glaube ein StreamHandle konnte nicht erstellt werden, teste mal ob das handle 0 ist. Hast du in Windows den Zugriff auf Mikro usw. erlaubt? Das kann man ja in Windows einstellen, generell muss das an sein, Apps(StoreApps) muss man nicht erlauben, das kann aus bleiben.

    @RodFromGermany Ich glaube der Code den ich verlinkt habe könnte Fehlerhaft sein, einige Parameter kommen mir fragwürdig vor.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ich habe gerader festgestellt, dass

    VB.NET-Quellcode

    1. Bass.BASS_Init(0, 0, 0, IntPtr.Zero)
    mit False zurückkommt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich denke da hat der Kollege den Fehlergemacht mit Samplerate 0, ich bin dem nun nicht nachgegangen.

    Zum 1. Parameter, 0 = No Sound, -1 DefaultDevice, falls du auf dem Default Device was ausgeben willst. Probier mal so ohne ausgabe, soll ja nur aufgezeichnet werden.

    VB.NET-Quellcode

    1. Bass.BASS_Init(0, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero)


    NAchdem essen, schaue ich mal, ob dann alles geht wie es soll, auch mit konvertierung.

    PS.
    @RodFromGermany ich hab das Projekt zum laufen gebracht, es wird auch aufgezeichnet, aber sobald Stille kommt, wird diese nicht geschrieben, ich erweitere das heute, ich muss nur noch mal schauen ob es da eine Option direkt für den "DUmmy"-Stream gibt, oder ob ich einen MixerStream dazwischen klemmen muss. Werde dann dort im Thread von @Nolde(wieso kann ich den nicht anpingen?) den geupdateten Code posten, geht ja nicht das hier nicht laufender Code im Codeaustausch ist.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DTF“ ()

    Hallo ihr Lieben,

    da kann ich eigentlich nur staunend zuschauen und hoffen, dass es euch gelingt eine lauffähige Version des Code Samples mit der Bass Software zu erstellen.

    Das ist offensichtlich nicht ganz so einfach wie es aussieht - ich glaube das übersteigt dann meine Möglichkeiten, da bleibt mir eigentlich nichts anderes übrig, als auf eure Expertise zu hoffen.

    Ganz gleich wie das hier ausgeht ... herzlichen Dank für euer bemerkenswertes Engagement!

    LG
    Peter
    So ich habe nun das Problem lösen können, Ich erzeuge einfach einen Tonlosen Endlosstream der auf dem Device "abgespielt wird"(variable "mixer"), so kommt auch Stille im Callback rein und wir können diese nun auch schreiben. Ich hab aber in C# gefummelt, VB kann ich einfach nicht mehr flüssig schreiben, schon allein weil ich Intellisense mit Enter bestätige und in VB wird mir da ein Zeilenumbruch reingehaun. Ich kann mit VB einfach nicht mehr.

    Die BassWaspi brauchste nicht mehr, dafür aber die BassMix. Also BassNet + bass.dll + bassenc.dll + bassmix.dll

    Daraus kannste dir nun schönen Code anfertigen:

    C#-Quellcode

    1. using System.Diagnostics;
    2. using Un4seen.Bass;
    3. using Un4seen.Bass.AddOn.Enc;
    4. using Un4seen.Bass.AddOn.Mix;
    5. namespace SoundRecorder
    6. {
    7. public partial class Form1 : Form
    8. {
    9. private List<Device> devices = new List<Device>();
    10. private int dummy = 0;
    11. private RECORDPROC? recProc;
    12. private int mixer = 0;
    13. int recChannel = 0;
    14. public Form1()
    15. {
    16. InitializeComponent();
    17. }
    18. private void Form1_Load(object sender, EventArgs e)
    19. {
    20. int devCount = Bass.BASS_GetDeviceCount();
    21. for (int i = 0; i < devCount; i++)
    22. {
    23. Bass.BASS_Init(i, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, 0);
    24. }
    25. devCount = Bass.BASS_RecordGetDeviceCount();
    26. for (int i = 0; i < devCount; i++)
    27. {
    28. BASS_DEVICEINFO info = new BASS_DEVICEINFO();
    29. if (Bass.BASS_RecordGetDeviceInfo(i, info))
    30. {
    31. if (Bass.BASS_RecordInit(i))
    32. {
    33. devices.Add(new Device(i, info.name));
    34. }
    35. }
    36. }
    37. dummy = Bass.BASS_StreamCreate(44100, 2, BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_DECODE, BASSStreamProc.STREAMPROC_DUMMY);
    38. comboBoxDevices.DataSource = devices;
    39. comboBoxDevices.DisplayMember = "Name";
    40. comboBoxDevices.DropDownStyle = ComboBoxStyle.DropDownList;
    41. comboBoxDevices.SelectedIndex = 0;
    42. }
    43. private bool MyRecording(int handle, IntPtr buffer, int length, IntPtr user)
    44. {
    45. Debug.WriteLine(length);
    46. Bass.BASS_ChannelGetData(dummy, buffer, length);
    47. return true;
    48. }
    49. private void buttonStartRecord_Click(object sender, EventArgs e)
    50. {
    51. Device? device = (Device?)comboBoxDevices.SelectedItem;
    52. if (device != null)
    53. {
    54. BASS_DEVICEINFO info = new BASS_DEVICEINFO();
    55. Bass.BASS_RecordSetDevice(device.Index);
    56. //BASS_GetDeviceInfo und BASS_RecordGetDeviceInfo unterscheiden sich nur dadurch, das "No Sound" in der ersten Liste ist. Also RecordDeviceIndex + 1 = AusgabeDeviceIndex. Dort luft dann der "leere" endlosstream.
    57. Bass.BASS_SetDevice(device.Index + 1);
    58. mixer = BassMix.BASS_Mixer_StreamCreate(44100, 2, BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_MIXER_NONSTOP);
    59. Bass.BASS_ChannelPlay(mixer, false);
    60. recProc = new RECORDPROC(MyRecording);
    61. recChannel = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_SAMPLE_FLOAT, 100, recProc, IntPtr.Zero);
    62. Bass.BASS_ChannelPlay(recChannel, false);
    63. BassEnc.BASS_Encode_Start(dummy, "output.wav", BASSEncode.BASS_ENCODE_PCM | BASSEncode.BASS_ENCODE_FP_16BIT | BASSEncode.BASS_ENCODE_AUTOFREE, null, 0);
    64. }
    65. }
    66. private void buttonStoprecord_Click(object sender, EventArgs e)
    67. {
    68. Bass.BASS_ChannelStop(recChannel);
    69. Bass.BASS_ChannelStop(mixer);
    70. Bass.BASS_StreamFree(mixer);
    71. Bass.BASS_StreamFree(recChannel);
    72. BassEnc.BASS_Encode_Stop(dummy);
    73. }
    74. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    75. {
    76. Bass.BASS_ChannelStop(recChannel);
    77. Bass.BASS_ChannelStop(mixer);
    78. BassEnc.BASS_Encode_Stop(dummy);
    79. Bass.BASS_StreamFree(dummy);
    80. Bass.BASS_StreamFree(mixer);
    81. Bass.BASS_StreamFree(recChannel);
    82. }
    83. }
    84. }


    C#-Quellcode

    1. internal class Device
    2. {
    3. public string Name { get; set; }
    4. public int Index { get; set; }
    5. public Device(int index, string name)
    6. {
    7. this.Name = name;
    8. this.Index = index;
    9. }
    10. }


    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „DTF“ ()

    @DTF Danke, funktioniert auf Anhieb, zunächst nur Lautsprecher (eine abgespielte Audio-Datei). :thumbup:
    Mit VB sehe ich das genau so, ich hab das Original zunächst nach C# konvertiert...
    Kleiner Verbesserungsvorschlag:

    C#-Quellcode

    1. private const string VoicePath = "D:\\Temp\\Audio\\";
    2. // ...
    3. string path = VoicePath + $"{DateTime.Now:yyyy-MM-dd--HH-mm-ss} output.wav";
    4. BassEnc.BASS_Encode_Start(this.dummy, path, BASSEncode.BASS_ENCODE_PCM | BASSEncode.BASS_ENCODE_FP_16BIT | BASSEncode.BASS_ENCODE_AUTOFREE, null, IntPtr.Zero);

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Kleiner Verbesserungsvorschlag:


    Ich hab auch noch einen. Ich habe die Streamhandles von Hand freigegeben, das muss man nicht. Bei erstellen eines Streams BASSFlag.BASS_STREAM_AUTOFREE nutzen, dann werden die von allein freigegeben und man spart sich Bass_StreamFree().
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Also das klingt ja sehr vielversprechend.

    Ich habe mich jetzt drangemacht, das Ganze in mein VB Programm einzubauen.

    Die erste Hürde mit dem .NET v4.8 Fehler habe ich genommen: Ich musste mein Visual Studio updaten. Dann kann man die Version .NET 4.8 setzen.

    Allerding scheitere ich schon beim ersten Aufruf der BASS.dll (s. Anhang)

    Verwende ich denn die richtigen DLLs ? Einen Screenshot der beiden verwendeten DLLs hab ich angehängt.

    Irgendwie scheint nix bei mir zu funktionieren ... :(

    LG
    Peter
    Bilder
    • s 2024-08-26 09-13-132.jpg

      47,64 kB, 1.025×235, 25 mal angesehen
    • s 2024-08-26 09-12-407.jpg

      14,58 kB, 901×73, 25 mal angesehen

    DTF schrieb:

    Achte auf die richtige Architektur(x86/x64), solltest du die falche Archtektur kopiert haben, müsstest du irgendeine Fehlermeldung mit BadImage oder so bekommen.


    Genau das habe ich bereits angesprochen. Du bist auf einem guten Weg die DLL wurde zumindest gefunden, hast aber die falschen DLLs kopiert. In den BassXXX-Zips sind immer 2 DLLs, die die du zuerst siehst ist die x86, aber wo diese ist, ist ein Ordner mit dem Namen x64, dortdrin ist die x64 variante. Du brauchst also nur die anderen in die Ausgabeordner zu kopieren. Das ist bei allen Archiven mit den nativen DLLs von BASS so.



    Peter329 schrieb:

    Die erste Hürde mit dem .NET v4.8 Fehler habe ich genommen:


    Fall du Nullable meinst,(das mit den ?), da kannste die Fragezeichen einfach weg lassen, ich meine Nullable gabs im alten FW noch nicht. Kann mich jedenfalls nicht dran erinnern.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    Mir scheint auch, dass ich nicht die richtigen DLLs lade. Aber ich erhalten keine Fehlermeldungen, die auf einen Architektur Missmatch hinweisen ... und die bass.dll habe ich aus dem x64 Ordner kopiert. Für die Bass.Net.dll gibt es nur die Ordner "core" und "full" ... ich habe den "full" Ordner gewählt.

    Ich habe mal die Verzeichnis Screen Shots angehängt ... vielleicht ist ja daraus ersichtilich, ob und wo ich den "falschen" zip-File verwende.

    Ich bin am verzweifeln ...

    LG
    Peter
    Bilder
    • s 2024-08-26 15-28-508.jpg

      14 kB, 895×149, 23 mal angesehen
    • s 2024-08-26 15-28-042.jpg

      12,58 kB, 895×149, 21 mal angesehen
    • s 2024-08-26 15-26-049.jpg

      11,96 kB, 895×149, 18 mal angesehen
    • s 2024-08-26 15-24-192.jpg

      20,35 kB, 898×130, 21 mal angesehen
    Mit der BassNet ist OK, sonst hättest du nicht die Fehlermeldung die du oben gezeigt hast bekommen. Die falsche BassEnc hast du aber. Kopier einfach entweder die x86 oder x64 DLLs in die Ausgabeordner. Ich weis ja nicht wie du dein Projekt konfiguriert hast.
    Das ist die richtige BassEnc
    https://www.un4seen.com/files/bassenc24.zip



    BassWasapi brauchste nicht mehr, aber die BassMix, die findest du auch bei un4seen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Peter329 schrieb:

    Mir scheint auch, dass ich nicht die richtigen DLLs lade.
    Überzeuge Dich davon, dass alle DLLs zu einer gemeinsamen Version gehören.
    Explorer -> rechte Maustaste -> Eigenschaften -> Details
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    -Franky- schrieb:

    Dann hat man diese ganzen Probleme nicht.


    Als Multiplatform-Entwickler muss ich da schmunzeln. Ich hätte keine Lust sowas für mehrere Betriebssysteme zu machen, da hätte man dann noch ganz andere Probleme. Mit der Bass ist es so gesehen immer das gleiche, entweder mit oder ohne Wrapper(gibt ja nicht nur die BassNet. gibt auch Wrapper für andere Sprachen), entweder auf den Wrapper verweisen(+ DLLs kopieren), oder die C++ DLLs/SOs verlinken. Sowas gehört IMO zu Grundlagen, wer da Probleme hat, hat wohl einiges nachzuholen, egal mit welcher Sprache man arbeitet. Da ich gerade bei Skills bin, wenn Peter sich hier schon so unegschickt anstellt, was glaubst du, wo das hinführen würde wenn er versucht die Interfaces zu implementieren. Ich hatte auch als ich mir die Dialoge für WPF gemacht kleine Fehler drin, die eine große Wirkung hatten. War nicht einfach die zu finden, aktuell würde ich Peter nicht zutrauen diese finden zu können.

    @Peter329 Stellt sich hier einfach nur ungeschickt an. Diese DLL zu nutzen, ist kinderleicht. Bestes Bespiel ist mein Neffe dem ich das Programmieren bei bringe. Der hat auf Anhieb ein Projekt mit der Bass prepariert, der wusste zu diesem Zeitpunkt wie man einen Verweis hinzufzufügt, das reichte, weil kopieren kann jeder. Ist ja nur ein Verweis hinzufügen und ein paar DLLs zu kopieren.

    Das unterschiedliche Versionen das Problem bei @Peter329 sind glaube ich nicht, die würden schon geladen werden können, aber es könnte an anderen Stellen zu Problemen kommen. Jede der Bass-Komponenten hat auch eine Funktion, so dass man auch via Code an die Version kommt Also Bass.Bass_GetVersion(), BassFx.BASS_FX_GetVersion() etc.... Wenn er jetzt alle DLLs runterlädt, kann er die Problemlos nutzen die sind kompatibel. Peter war ja schon bei der Fehlermeldung, die nur kommt, wenn man die falschen(auf die Architektur bezogen) DLLs kopiert.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DTF“ ()