Guten Morgen
Ich nehme mit der bass.dll den Sound einer externen Quelle auf und zwischenspeichere die Audiodaten erstmal in einem Byte-Array. Die Audiodaten werden dazu auch in einer WaveForm angezeigt.
Ich habe mal alle Codestellen hier geschrieben, von denen ich denke, dass sie relavant sind.
Aber wenn ich die Aufnahme stoppe, friert mein Programmm regelmässig, aber nicht immer ein. Die Klasse (ViewModel) wird so initialisiert:
Edit: Weiss nicht warum, aber mittlerweile friert es jedes Mal ein...
Spoiler anzeigen
Dann gibt es noch diesen Timerhandler:
Spoiler anzeigen
Die Methode, die beim Klicken des Start/Stopp-Buttons ausgeführt wird, sieht so aus:
Spoiler anzeigen
Während der Aufnahme ruft die bass.dll alle paar Millisekunden, wie ich denke, diese Callbackfunktion auf:
Spoiler anzeigen
Ich nehme mit der bass.dll den Sound einer externen Quelle auf und zwischenspeichere die Audiodaten erstmal in einem Byte-Array. Die Audiodaten werden dazu auch in einer WaveForm angezeigt.
Ich habe mal alle Codestellen hier geschrieben, von denen ich denke, dass sie relavant sind.
Aber wenn ich die Aufnahme stoppe, friert mein Programmm regelmässig, aber nicht immer ein. Die Klasse (ViewModel) wird so initialisiert:
Edit: Weiss nicht warum, aber mittlerweile friert es jedes Mal ein...
VB.NET-Quellcode
- Private IsRecording As Boolean
- Private HasRecorded As Boolean
- Private Peak(2) As Single
- Private PeakTimer As New System.Timers.Timer
- Private _RecordingOrStoppedIcon As String
- Public Property RecordingOrStoppedIcon As String
- Get
- Return _RecordingOrStoppedIcon
- End Get
- Set(value As String)
- _RecordingOrStoppedIcon = value
- RaisePropertyChanged()
- End Set
- End Property
- Private _PeakL As Single
- Public Property PeakL As Single
- Get
- Return _PeakL
- End Get
- Set(value As Single)
- _PeakL = value
- RaisePropertyChanged()
- End Set
- End Property
- Private _PeakR As Single
- Public Property PeakR As Single
- Get
- Return _PeakR
- End Get
- Set(value As Single)
- _PeakR = value
- RaisePropertyChanged()
- End Set
- End Property
- Public Sub New()
- RecordingOrStoppedIcon = RecordingIcon
- PeakTimer.Interval = 50
- AddHandler PeakTimer.Elapsed, AddressOf UpdatePeak
- PeakTimer.Start()
- End Sub
Dann gibt es noch diesen Timerhandler:
VB.NET-Quellcode
- Private Sub UpdatePeak(sender As Object, e As ElapsedEventArgs)
- If RecordingChannel <> Nothing Then
- If StereoOn Then
- Bass.BASS_ChannelGetLevel(RecordingChannel, Peak, 0.05, BASSLevel.BASS_LEVEL_ALL)
- PeakL = Peak(2)
- PeakR = Peak(1)
- Else
- Bass.BASS_ChannelGetLevel(RecordingChannel, Peak, 0.05, BASSLevel.BASS_LEVEL_MONO)
- PeakL = Peak(0)
- PeakR = Peak(0)
- End If
- End If
- End Sub
Die Methode, die beim Klicken des Start/Stopp-Buttons ausgeführt wird, sieht so aus:
VB.NET-Quellcode
- Private Sub StarteRecording_Execute(obj As Object)
- If HasRecorded Then
- Dim OKVM = New OKDialogViewModel
- OKVM.Meldung = "Du hast bereits eine Aufnahme gemacht, ohne diese zu speichern. Um eine neue Aufname zu machen, verwerfe oder speichere die aktuelle Aufnahme."
- dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
- Return
- End If
- If Not IsRecording Then
- Bass.BASS_RecordInit(MainModule.LayerVM.SettingsViewModel.LineInIndex)
- MeineRecordingCallback = New RECORDPROC(AddressOf MyRecording)
- ' start recording paused
- RecordingChannel = Bass.BASS_RecordStart(44100, NumberOfChannels, BASSFlag.BASS_RECORD_PAUSE, MeineRecordingCallback, IntPtr.Zero)
- ' really start recording
- Bass.BASS_ChannelPlay(RecordingChannel, False)
- InitialisiereWaveForm()
- Dim Laenge As Single = CSng(Bass.BASS_ChannelBytes2Seconds(RecordingChannel, CLng(MaxTrackLaengeInBytes)))
- WF.RenderStartRecording(RecordingChannel, Laenge, 0)
- 'End Playback during recording
- RecordingOrStoppedIcon = StoppedIcon
- IsRecording = True
- Else
- Bass.BASS_ChannelStop(RecordingChannel) 'Hier friert das Programm ein, ich kann also auch in der nächsten Zeile den ErrorCode nicht abfragen
- Debug.WriteLine("STOP: " & Bass.BASS_ErrorGetCode.ToString) 'diese Zeile wird nicht mehr ausgeführt
- PeakL = 0
- PeakR = 0
- RecordingOrStoppedIcon = RecordingIcon
- HasRecorded = True
- IsRecording = False
- End If
- End Sub
Während der Aufnahme ruft die bass.dll alle paar Millisekunden, wie ich denke, diese Callbackfunktion auf:
VB.NET-Quellcode
- Private Function MyRecording(handle As Integer, buffer As IntPtr, length As Integer, user As IntPtr) As Boolean
- Dim cont As Boolean = True
- If length > 0 AndAlso buffer <> IntPtr.Zero Then
- If RecordedData Is Nothing OrElse RecordedData.Length < length Then
- RecordedData = New Byte(length) {}
- End If
- ReDim Preserve RecordedData(BytesWritten + length - 1)
- ' copy from managed to unmanaged memory
- Marshal.Copy(buffer, RecordedData, BytesWritten, length)
- BytesWritten += length
- Dim Prozent As Double = BytesWritten / MaxTrackLaengeInBytes * 100
- RecordingXPosWF = WFBreite / 100 * Prozent
- RecordingPosition = TimeSpan.FromSeconds(GetPositionInSeconds(RecordingXPosWF))
- ' get and draw our live recording waveform
- WF.RenderRecording(buffer, length)
- Try
- Services.ServiceContainer.GetService(Of IMainWindowService)?.HoleDispatcher().Invoke(Sub() WellenFormZeichnen())
- Catch
- End Try
- If BytesWritten >= MaxTrackLaengeInBytes Then
- cont = False ' stop recording
- End If
- End If
- Return cont
- End Function
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()