| |

VB.NET - FortgeschritteneSinuston ausgeben, Ton wird nicht verändert? Stream wird nicht gelöscht. | |  | Autor: fsg4u | Datum: 06.04.12 12:52 |
| Moin moin,
Ich versuche gerade verschiedene Töne über die Soundkarte auszugeben.
Einen Ton kann ich auch ausgeben, aber wenn ich im Programm, dann die Frequenz, Amplitude oder Länge(Duration) änder, und wieder play mache, spielt er trotzdem nur den gleichen ton, obwohl ich createSignalData wieder neuaurufe.
Ich hab das Gefühl, dass er den Stream des Mediaplayers einfach nicht löscht. Starte ich das programm neu, kann ich einen anderen ton erzeugen.
Habt ihr eine Idee? Anbei mein Code:
Hab 2 Klassen. Meine Main und eine Audio.
Option Explicit On
Imports System.Runtime.InteropServices
Imports System.Threading.Thread
Public Class Main
Dim a As New audio
Private Sub BtTest_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles BtTest.Click
a.CreateSignalData(1300, 1300, 30, TextBox1.Text) 'die länge des tons
' wird aus der textbox gelesen. frequenz für L und R sind 1300 Hz.
' Amplitude bleibt bei 30
a.StartPlay() 'startet den player
End Sub
end class
Public Class audio
Dim myFreqStream As New IO.MemoryStream
Dim myStreamWriter As New IO.BinaryWriter(Me.myFreqStream)
' Physikal. Parameter
Private myDuration As Double ' Zeit in Sekunden
Private myFreq_1 As Double ' Frequenz in Hz
Private myFreq_2 As Double
Private myPhaseshift As Double ' Phasenverschiebung links/rechts in Grad
Private myAmplitude As Double ' Amplitude 0-100
' Wav-Parameter
Private mySamlpelsPerSecond As Integer 'VB6 Long
Private myBlockalign As Short 'VB6 Integer
Private myChannels As Short 'VB6 Integer
Private myBitsPerSample As Short 'VB6 Integer
Private mySoundData() As Integer 'VB6 Long
Private Const Pi2 As Double = Math.PI * 2 '6.28318530717959
Public ReadOnly Property FreqStream() As IO.Stream
Get
Me.myFreqStream.Position = 0
For i As Integer = Me.mySoundData.GetLowerBound(0) To _
Me.mySoundData.GetUpperBound(0)
Me.myStreamWriter.Write(mySoundData(i))
Next
Return Me.myFreqStream
End Get
End Property
Public Sub CreateSignalData(ByVal freqL As Integer, ByVal freqR As Integer, _
ByVal Ampl As Double, ByVal dur As Double)
myDuration = dur
mySamlpelsPerSecond = 44100
myFreq_1 = freqL
myFreq_2 = freqR
myAmplitude = Ampl
myBitsPerSample = 16
myChannels = 2
myPhaseshift = 180
Dim t As Double
Dim tStep As Double
Dim w1 As Double
Dim w2 As Double
Dim nSamples As Integer 'VB6 Long
Dim A As Double
Dim Phi As Double
Dim i As Integer 'VB6 Long
nSamples = CInt(myDuration * mySamlpelsPerSecond)
tStep = 1 / mySamlpelsPerSecond
w1 = myFreq_1 * Pi2
w2 = myFreq_2 * Pi2
Phi = myPhaseshift * Pi2 / 360
ReDim mySoundData(nSamples + 10)
A = (myAmplitude / 100) * 32000
For i = 11 To nSamples + 10
mySoundData(i) = CInt(65536 * CInt(A * Math.Sin(w1 * t)) + A * _
Math.Sin(w2 * t + Phi))
t = t + tStep
Next i
Call SetHeader(nSamples * 4)
End Sub
Private Sub SetHeader(ByVal nBytes As Long)
myBlockalign = CShort(myChannels * myBitsPerSample / 8)
mySoundData(0) = 1179011410 ' Riff
mySoundData(1) = CInt(nBytes + 36) ' Länge
mySoundData(2) = 1163280727 ' Wave
mySoundData(3) = 544501094 ' fmt
mySoundData(4) = 16 ' immer 16 (auch bei 8 Bit-Sound)
mySoundData(5) = myChannels * 65536 + 1
mySoundData(6) = mySamlpelsPerSecond ' SPS
mySoundData(7) = mySamlpelsPerSecond * myBlockalign
mySoundData(8) = myBitsPerSample * 65536 + myBlockalign
mySoundData(9) = 1635017060 ' "DATA"
mySoundData(10) = CInt(nBytes) ' Datenlänge in Byte
End Sub
Protected Overrides Sub Finalize() 'keine ahnung wofür das hier ist und
' wann man es aufrufen soll
Me.myFreqStream.Dispose()
MyBase.Finalize()
End Sub
Private WithEvents myPlayer As New System.Media.SoundPlayer()
Public WriteOnly Property AudioData() As IO.Stream
Set(ByVal value As IO.Stream)
value.Position = 0
Me.myPlayer.Stream = value
End Set
End Property
Public Sub StartPlay()
AudioData = FreqStream
Me.myPlayer.Play()
End Sub
Public Sub StopPlay()
Me.myPlayer.Stop()
End Sub
End Class |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
sevISDN 1.0 
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevZIP40 Pro DLL 
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|