MiniAudio-Wrapper WASAPI MP3 RECORDING

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Midimaster

Betreff: MiniAudio-Wrapper WASAPI MP3 RECORDING

BeitragDi, Apr 27, 2021 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit der Audio-Library MiniAudio wird ein modernerer Zugriff auf Audio-Devices möglich. Ich stelle hier mal die Möglichkeiten vor und hänge die benötigen File gleich unten dran.

MiniAudio Audio-Library Wrapper für BlitzMax NG

Diese Schnittstelle ermöglicht ...

- Audiowiedergabe mit geringer Latenz von 30 ms über WASAPI
- Echtzeit-Samples Zugriff in bereits gestartete Sounds
- MP3-Dekodierung
- Full Duplex: gleichzeitig Aufnahme und Wiedergabe
- Leicht zu bedienende Audioaufnahme mit geringer Latenz
- Konvertierung von TAudioSamples in signed-32bit oder float32bit Samples
- der Wrapper ist als Module geschrieben


MiniAudio ist eine C-Bibliothek für verschiedene Betriebssysteme: Mac, Linux, Windows, ... Alle Informationen und den Quellcode findet Ihr hier:
https://miniaud.io/index.html

Für BlitzMax benötigt Ihr nur das Modul mima.miniaudio, das Ihr auf diesem GitHub-Account findet:

https://github.com/MidimasterS...io-Wrapper

Das Module enthält 3 Dateien:
- MiniAudioWrapper.c
- MiniAudio.bmx
- MiniAudiox.h
- Duc-Ordner für ausführliche BlitzMax-Hilfe

Außerdem findet Ihr dort viele Code-Beispiele und die dazu passenden Audiodateien zum Testen.

Dies ist Version 1.25 vom 2021-06-08.



Dies sind die Funktionen, die bereits funktionieren:

- Wiedergabe MONO STEREO, 3-32 Channels
- MP3- und FLAC-Dateien wiedergeben mit PlaySound()
- Recording aufnehmen MONO, STEREO oder 3-32 Channels
- Alle Hardwaregeräte auf allen Plattformen werden akzeptiert inkl. WASAPI unter Windows
- Formate: 8bit, 16bit, 32bit und 32bit-float
- Abtastraten von 8000-192000Hz
- Geringe Latenz von 30 ms
- jetzt auch problemlos im DEBUG mode nutzbar
- Konvertierung von TAudioSamples
- CallBack-Access, Multithread
- eigene Audios als WAV-Datei speichern, auch Streams!
- USB-Hardware Audio-Devices nutzen bis 32 Channels


Inhalt der ZIP-Datei:

MiniAudio.bmx
der BlitzMax-Teil des Wrappers. Die BlitzMax-Hilfe zeigt alle verfügbaren Funktionen an


MiniAudioWrapper.c
der C-Teil des Wrappers. Ändere dort nichts.

MiniAudiox.h
die eigentliche Bibliothek von David Reid - mackron@gmail.com. Sie musste an 6 Stellen leicht modifiziert werden, damit sie auch unter BlitzMax DEBUG-mode funktioniert. Ändere dort nichts.


OpenClose.bmx
Erste Demo-App. Öffnet das Gerät für die Wiedergabe und zeigt einige Informationen an. Schließen Sie es dann sofort.


PlayNoise.bmx
Zweite Demo-App. Erzeugt nur Geräusche, wenn die Maus gedrückt wird.


MiniAudioTestLatency.bmx
Ermöglicht das Erkennen der Latenz des Geräts. Höre auf die Zeitverzögerung zwischen dem rhythmischen Knistern und Deinem Mausklick an


StereoSinus
Demonstriert, wie man Audio-Samples in Echtzeit erstellt. Verwendet STEREO, um zwei verschiedene Wellenformen zu erstellen.


FreeAudioMove.bmx
(einschließlich Test.ABC.ogg)
Demonstriert, wie ein vorhandenes Audiofile einfach wiedergegeben wird. Verwendet 16-Bit-MONO und 12-kHz sowie Standard-SHORTs ohne Vorzeichen.


Reverb.bmx
(einschließlich Test.ABC.ogg)
Demonstriert, wie ein vorhandenes Audiofile in Echtzeit bearbeitet wird. Verwendet 16-Bit-MONO und 12-kHz, aber interne 32-Bit-Int-Samples mit Vorzeichen


CaptureRecording.bmx
(einschließlich Test.ABC.ogg)
Demonstriert, wie ein 16-Bit-MONO-INPUT-Device mit 48 kHz erfasst und die Samples in einem TAudioSample gespeichert werden. Außerdem wird DUPLEX aktiviert, um das eingehende Signal sofort abzuhören.


LoadMP3.bmx
(einschließlich Test.ABC.mp3)
Demonstriert das Öffnen einer MP3-Datei für TAudioSample und TSound, PlaySound.



ConvertAudioSample.bmx
(einschließlich Test.ABC.ogg)
Demonstriert das Konvertieren eines TAudioSamples in moderne 32bit-float-Samples (Werte von -1.00 bis +1.00)


SaveTAudioSample.bmx
(einschließlich Test.ABC.ogg)
Demonstriert, wie ein BlitzMax AudioSample in einer WAV-Datei gespeichert wird. Dies funktioniert mit MONO und STEREO, 8 Bit und 16 Bit und beliebiger SampleRate.


WriteWavFile.bmx
Demonstriert, wie ein TBank-Inhalt in einer WAV-Datei gespeichert wird. Dies funktioniert mit 1-32 Kanälen, 8-Bit- und 16-Bit-32-Bit- und 32-Bit-Float und beliebiger SampleRate. Kann auch zum kontinuierlichen Speichern von Audio-Streams verwendet werden.



CaptureRecording_II.bmx
Demonstriert, wie Capture in höchster Qualität vom STEREO IN mit 48 kHz 32bit-FLOAT erfasst wird, sofort via DUPLEX-Monitoring auf die Computerlautsprechern umgeleitet wird. Am Ende werden die Audio-Daten als WAV-Datei gespeichert.



CaptureRecording_III.bmx
Demonstriert, wie 8 IN-Kanäle eines USB-Audio-Interfaces mit 48 kHz erfasst, die Samples modifiziert und auf STEREO reduziert werden, um sofort DUPLEX-Monitoring auf den Computerlautsprechern zu haben. Alle Eingänge werden in hoher Qualität in eine 8-Spur WAV-Datei mit 32bit-INT gespeichert.




Hier findet Ihr ab sofort immer die aktuelle Version des Wrapper und allen Code-Beispielen:
https://github.com/MidimasterS...io-Wrapper
  • Zuletzt bearbeitet von Midimaster am Mi, Jun 09, 2021 12:58, insgesamt 3-mal bearbeitet

Midimaster

Betreff: MiniAudio jetzt als Module erhältlich

BeitragMi, Mai 12, 2021 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe die neueste Version vom MiniAudio-Wrapper hochgeladen. Jetzt ist das ganze als Module in BlitzMax nutzbar. Inclusive Dokumente für die BlitzMax-Hilfe.

Neu dazugekommen ist jetzt:

DUPLEX-Audio was gleichzeitiges Recording und Wiedergabe ermöglicht

TAudioSample-Konvertierung, um 16bit-Samples in 32bit-float-Samples umzuwandeln


als nächstes werde ich wohl mal die Equalizer-Möglichkeiten des MiniAudio für BlitzMax vefügbar machen.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Midimaster

Betreff: USB Audio Device Capture and WAV Saving FLAC

BeitragFr, Mai 21, 2021 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Die neueste Version des MiniAudio-Wrapper ist online. Ab jetzt kann man:

FLAC und WAV-Dateien laden auch mit 24bit und 32bit samples und auch bis zu 32 channels.

Audio-Daten als WAV-Dateien speichern. Es lassen sich die alten BlitzMax-Formate speichern. Aber natürlich auch die neuen Multi-Channel-Formate 1-32 channels mit 32bit-int und 32bit-float Formaten.

Ebenso ist es jetzt möglich mit MiniAudio Hardware-USB-Audio Devices mit bis zu 32-Spuren für Capture (Recording) und Playback ohne nennenswerte Latenzzeit zu verwenden.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Midimaster

Betreff: Jetzt auf GitHub und mit erweitertem ExTaudioSample Type

BeitragMi, Jun 09, 2021 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ab sofort findet ihr das MiniAudio-Modul in eime eigenen GitHub-Account. Dort ist aber sofort die Version 1.25 zum Download bereit.

Hier mal drei Möglichkeiten, wie man mit Capture Audio-Recording über das MiniAudio-Modul machen könnte:
(Den vollständigen code findet Ihr auf dem GitHub und im MOD-Ordner)


Einfaches Capture in das alte BlitzMax TAudioSample

BlitzMax: [AUSKLAPPEN]
    SuperStrict
Import mima.miniaudio

Graphics 400,300

' Setup of the device:
Const HERTZ:Int = 48000

Global MiniAudio:TMiniAudio=New TMiniAudio

MiniAudio.OpenDevice( MiniAudio.DUPLEX, Miniaudio.FORMAT_S16, 1, HERTZ, MyCallBack)

' we need a TaudioSample for storing the incoming samples and a SHORT PTR to handle them
Global Recording:TAudioSample=CreateAudioSample( HERTZ*61, HERTZ, SF_MONO16LE) '60 seconds
Global RecordingRam:Short Ptr = Recording.Samples

Global WritePointer:Int, RecordMode%, Audio:TChannel
Local Music:TSound =LoadSound(Recording)
Audio=PlaySound(Music)

SetClsColor 255,255,255
Repeat
Cls
DrawScreen
If MouseHit(1)
RecordMode=1-RecordMode
If RecordMode=0
Print "PLAY"
MiniAudio.StopDevice()
Local Music:TSound =LoadSound(Recording)
Audio=PlaySound(music)
Else
Print "RECORD"
ClearSample()
StopChannel Audio
WritePointer=0
MiniAudio.StartDevice()
EndIf
EndIf
Flip 0
Until AppTerminate()
Miniaudio.CloseDevice()


Function MyCallBack(a%, PlayBackBuffer:Short Ptr, RecordingBuffer:Short Ptr, Frames:Int)
' cares about not to overrun the TAudioSample-size:
If WritePointer>HERTZ*60 Then WritePointer=0

For Local i:Int=0 To frames-1
' fetch the sample:
Local value:Short = RecordingBuffer[i]

' duplx it immediately:
PlayBackBuffer[i] = value

'and transfer it to the TAudioSample:
RecordingRAM[WritePointer+i] = value
Next
WritePointer = WritePointer + Frames
End Function


Function ClearSample()
For Local i:Int=0 To HERTZ*60
RecordingRAM[i]=0
Next
End Function

Function DrawScreen()
...
End Function




STEREO Capture mit hoher Qualität 32bit-Float und Speicherung als WAV-Datei

BlitzMax: [AUSKLAPPEN]
    SuperStrict
Import mima.miniaudio

Graphics 400,300

' Setup of the device:
Const HERTZ:Int = 48000
Const CHANNELS:Int = 2

Global MiniAudio:TMiniAudio=New TMiniAudio

Global Recording:ExTAudioSample = ExTAudioSample.Create(HERTZ*61, HERTZ, MiniAudio.FORMAT_F32, CHANNELS)
Print Recording.format
Print Recording.Hertz
Print Recording.channels
MiniAudio.OpenDevice( MiniAudio.DUPLEX, Miniaudio.FORMAT_F32, CHANNELS, HERTZ, MyCallBack)


Global WritePointer:Int, RecordMode%
SetClsColor 255,255,255
Repeat
Cls
DrawScreen
If MouseHit(1)
RecordMode=1-RecordMode
If RecordMode=0
Print "PLAY"
MiniAudio.StopDevice()
MiniAudio.SaveExTAudioSample "MySong.WAV", Recording
Else
Print "RECORD"
Recording.Clear
WritePointer=0
MiniAudio.StartDevice()
EndIf
EndIf
Flip 0
Until AppTerminate()
Miniaudio.CloseDevice()
End


Function MyCallBack(a%, PlayBackBuffer:Float Ptr, RecordingBuffer:Float Ptr, Frames%)
' cares about not to overrun the ExTAudioSample-size:
If WritePointer>HERTZ*60 Then WritePointer=0

For Local i:Int=0 To frames-1
' fetch the sample:
Local value:Float = RecordingBuffer[i]

' duplx it immediately:
PlayBackBuffer[i] = value

'and transfer it to the TAudioSample:
Recording.SampleFloat[WritePointer+i] = value
Next
WritePointer = WritePointer + Frames

End Function




Function DrawDrawScreen()
...
End Function



8 Kanal Capture vom USB-Hardware-Device und Speicherung als 8-Track-WAV-Datei

BlitzMax: [AUSKLAPPEN]
    ' example to demonstrate MULTI-CHANNEL capturing audio with miniaudio
' and transfering datas to the NEW extended ExTAudioSample type
' Quality is FORMAT_S32 only for demonstration
' the DUPLEX will reduce the 8 channels to 2 "manually"
' when recording is stopped the ExTAudioSample is saved as a 8track-16bit WAV-file
' this make it necessary to convert from S32 to S16
SuperStrict
Import mima.miniaudio

Graphics 400,300

' Setup of the device:
Const HERTZ:Int = 44100
Const CHANNELS:Int = 8

Global MiniAudio:TMiniAudio=New TMiniAudio

'only hardware devices can capture 8 channels. So connect your USB-device and select it with its ID:
Print "Capture-Devices:"
Local i:Int
For Local DeviceName:String= EachIn MiniAudio.CaptureDevices()
Print "ID=" + i + ": " + DeviceName
i=i+1
Next
Local MyUsbDevice:Int=1
Miniaudio.SelectDevices(-1,MyUsbDevice)


Global Recording:ExTAudioSample = ExTAudioSample.Create(HERTZ*61, HERTZ, MiniAudio.FORMAT_S32, CHANNELS)
Print Recording.format
Print Recording.Hertz
Print Recording.channels
' use OpenDevice_II when Playback and Capture needs different parameters:
MiniAudio.OpenDevice_II( MiniAudio.DUPLEX, Miniaudio.FORMAT_S32, 2, Miniaudio.FORMAT_S32, CHANNELS, HERTZ, MyCallBack)


Global WritePointer:Int
Global RecordMode%

SetClsColor 255,255,255
Repeat
Cls
DrawScreen
If MouseHit(1)
RecordMode=1-RecordMode
If RecordMode=0
Print "PLAY"
MiniAudio.StopDevice()
'this would easily save the wav with 32bit-INT:
MiniAudio.SaveExTAudioSample "MySong.WAV", Recording

' but we can also change the format during saving:
Local StreamID:MMStreamID = MiniAudio.OpenWavFile("My16bitsong.Wav" , Miniaudio.FORMAT_S16, CHANNELS, HERTZ)
MiniAudio.WriteWavFile StreamID, Recording.SampleInt, Recording.Frames, Recording.Format, CHANNELS, HERTZ
MiniAudio.CloseWavfile StreamID
Else
Print "RECORD"
Recording.Clear
WritePointer=0
MiniAudio.StartDevice()
EndIf
EndIf
Flip 0
Until AppTerminate()
Miniaudio.CloseDevice()
End


Function MyCallBack(a%, PlayBackBuffer:Int Ptr, RecordingBuffer:Int Ptr, Frames:Int)
If WritePointer > (HERTZ*60*CHANNELS) Then WritePointer=0

For Local i:Int=0 To Frames-1
For Local j:Int=0 To CHANNELS-1
' fetch the samples:
Local value:Int = RecordingBuffer[i*CHANNELS + j]

'and transfer it to the TAudioSample:
Recording.SampleInt[WritePointer+i*CHANNELS + j] = value
Next
' now route the 8 capture channels to only 2 playbak channels as you like:
' to prevent Distortion we divide each sample volume by 2
Local valueL:Int = RecordingBuffer[8*i+0]/2 + RecordingBuffer[8*i+1]/2 + RecordingBuffer[8*i+2]/2 + RecordingBuffer[8*i+3]/2
Local valueR:Int = RecordingBuffer[8*i+4]/2 + RecordingBuffer[8*i+5]/2 + RecordingBuffer[8*i+6]/2 + RecordingBuffer[8*i+7]/2
PlayBackBuffer[2*i+0] = valueL
PlayBackBuffer[2*i+1] = valueR
Next
WritePointer = WritePointer + Frames*CHANNELS
End Function


Function DrawScreen()
...
End Function
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group