Unflüssige Anwendung

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Unflüssige Anwendung

    Hallo,

    ich habe eine kleine App geschrieben, mit der ich die Lautstärke vom Discord sowohl mit einem Hotkey als auch mit einer Trackbar ändern kann.
    Ich habe ein Label erstellt, welches mir die Lautstärke in % anzeigt. Dieses wir mit einem Timer dessen Intervall auf 1 ist geupdatet.
    Jedoch wenn ich die Trackbar betätige, wird das Label nicht flüssig geupdatet. Siehe Grafik

    Mein Code sieht wie folgt aus: -Hoffe, ihr steigt durch, es fehlt nichts und ihr könnt mir helfen :)
    Danke im Voraus
    Spoiler anzeigen

    Quellcode

    1. Dim VolumeDiscord As Single = 50.0F
    2. Private Sub VolumeProgramm1_Scroll(sender As Object, e As EventArgs) Handles VolumeProgramm1.Scroll
    3. VolumeDiscord = VolumeProgramm1.Value
    4. SetApplicationSound("discord", VolumeDiscord)


    TIMER:

    Quellcode

    1. VolumeLabel1.Text = VolumeDiscord & " %"





    EDIT:

    Ich denke es liegt an der Funktion, welche die Lautstärke ändert. Scheint recht unflüssig zu laufen. Hier auch noch mal der Code:
    Spoiler anzeigen

    Quellcode

    1. Public Class VolumeMixer
    2. Public Shared Function GetApplicationVolume(ByVal pid As Integer) As Single?
    3. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    4. If volume Is Nothing Then Return Nothing
    5. Dim level As Single
    6. volume.GetMasterVolume(level)
    7. Marshal.ReleaseComObject(volume)
    8. Return level * 100
    9. End Function
    10. Public Shared Function GetApplicationMute(ByVal pid As Integer) As Boolean?
    11. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    12. If volume Is Nothing Then Return Nothing
    13. Dim mute As Boolean
    14. volume.GetMute(mute)
    15. Marshal.ReleaseComObject(volume)
    16. Return mute
    17. End Function
    18. Public Shared Sub SetApplicationVolume(ByVal pid As Integer, ByVal level As Single)
    19. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    20. If volume Is Nothing Then Return
    21. Dim guid As Guid = Guid.Empty
    22. volume.SetMasterVolume(level / 100, guid)
    23. Marshal.ReleaseComObject(volume)
    24. End Sub
    25. Public Shared Sub SetApplicationMute(ByVal pid As Integer, ByVal mute As Boolean)
    26. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    27. If volume Is Nothing Then Return
    28. Dim guid As Guid = Guid.Empty
    29. volume.SetMute(mute, guid)
    30. Marshal.ReleaseComObject(volume)
    31. End Sub
    32. Private Shared Function GetVolumeObject(ByVal pid As Integer) As ISimpleAudioVolume
    33. Dim deviceEnumerator As IMMDeviceEnumerator = CType((New MMDeviceEnumerator()), IMMDeviceEnumerator)
    34. Dim speakers As IMMDevice
    35. deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, speakers)
    36. Dim IID_IAudioSessionManager2 As Guid = GetType(IAudioSessionManager2).GUID
    37. Dim o As Object
    38. speakers.Activate(IID_IAudioSessionManager2, 0, IntPtr.Zero, o)
    39. Dim mgr As IAudioSessionManager2 = CType(o, IAudioSessionManager2)
    40. Dim sessionEnumerator As IAudioSessionEnumerator
    41. mgr.GetSessionEnumerator(sessionEnumerator)
    42. Dim count As Integer
    43. sessionEnumerator.GetCount(count)
    44. Dim volumeControl As ISimpleAudioVolume = Nothing
    45. For i As Integer = 0 To count - 1
    46. Dim ctl As IAudioSessionControl2
    47. sessionEnumerator.GetSession(i, ctl)
    48. Dim cpid As Integer
    49. ctl.GetProcessId(cpid)
    50. If cpid = pid Then
    51. volumeControl = TryCast(ctl, ISimpleAudioVolume)
    52. Exit For
    53. End If
    54. Marshal.ReleaseComObject(ctl)
    55. Next
    56. Marshal.ReleaseComObject(sessionEnumerator)
    57. Marshal.ReleaseComObject(mgr)
    58. Marshal.ReleaseComObject(speakers)
    59. Marshal.ReleaseComObject(deviceEnumerator)
    60. Return volumeControl
    61. End Function
    62. End Class
    63. <ComImport>
    64. <Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")>
    65. Friend Class MMDeviceEnumerator
    66. End Class
    67. Friend Enum EDataFlow
    68. eRender
    69. eCapture
    70. eAll
    71. EDataFlow_enum_count
    72. End Enum
    73. Friend Enum ERole
    74. eConsole
    75. eMultimedia
    76. eCommunications
    77. ERole_enum_count
    78. End Enum
    79. <Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    80. Friend Interface IMMDeviceEnumerator
    81. Function NotImpl1() As Integer
    82. <PreserveSig>
    83. Function GetDefaultAudioEndpoint(ByVal dataFlow As EDataFlow, ByVal role As ERole, <Out> ByRef ppDevice As IMMDevice) As Integer
    84. End Interface
    85. <Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    86. Friend Interface IMMDevice
    87. <PreserveSig>
    88. Function Activate(ByRef iid As Guid, ByVal dwClsCtx As Integer, ByVal pActivationParams As IntPtr, <Out>
    89. <MarshalAs(UnmanagedType.IUnknown)> ByRef ppInterface As Object) As Integer
    90. End Interface
    91. <Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    92. Friend Interface IAudioSessionManager2
    93. Function NotImpl1() As Integer
    94. Function NotImpl2() As Integer
    95. <PreserveSig>
    96. Function GetSessionEnumerator(<Out> ByRef SessionEnum As IAudioSessionEnumerator) As Integer
    97. End Interface
    98. <Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    99. Friend Interface IAudioSessionEnumerator
    100. <PreserveSig>
    101. Function GetCount(<Out> ByRef SessionCount As Integer) As Integer
    102. <PreserveSig>
    103. Function GetSession(ByVal SessionCount As Integer, <Out> ByRef Session As IAudioSessionControl2) As Integer
    104. End Interface
    105. <Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    106. Friend Interface ISimpleAudioVolume
    107. <PreserveSig>
    108. Function SetMasterVolume(ByVal fLevel As Single, ByRef EventContext As Guid) As Integer
    109. <PreserveSig>
    110. Function GetMasterVolume(<Out> ByRef pfLevel As Single) As Integer
    111. <PreserveSig>
    112. Function SetMute(ByVal bMute As Boolean, ByRef EventContext As Guid) As Integer
    113. <PreserveSig>
    114. Function GetMute(<Out> ByRef pbMute As Boolean) As Integer
    115. End Interface
    116. <Guid("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    117. Friend Interface IAudioSessionControl2
    118. <PreserveSig>
    119. Function NotImpl0() As Integer
    120. <PreserveSig>
    121. Function GetDisplayName(<Out>
    122. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    123. <PreserveSig>
    124. Function SetDisplayName(
    125. <MarshalAs(UnmanagedType.LPWStr)> ByVal Value As String,
    126. <MarshalAs(UnmanagedType.LPStruct)> ByVal EventContext As Guid) As Integer
    127. <PreserveSig>
    128. Function GetIconPath(<Out>
    129. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    130. <PreserveSig>
    131. Function SetIconPath(
    132. <MarshalAs(UnmanagedType.LPWStr)> ByVal Value As String,
    133. <MarshalAs(UnmanagedType.LPStruct)> ByVal EventContext As Guid) As Integer
    134. <PreserveSig>
    135. Function GetGroupingParam(<Out> ByRef pRetVal As Guid) As Integer
    136. <PreserveSig>
    137. Function SetGroupingParam(
    138. <MarshalAs(UnmanagedType.LPStruct)> ByVal Override As Guid,
    139. <MarshalAs(UnmanagedType.LPStruct)> ByVal EventContext As Guid) As Integer
    140. <PreserveSig>
    141. Function NotImpl1() As Integer
    142. <PreserveSig>
    143. Function NotImpl2() As Integer
    144. <PreserveSig>
    145. Function GetSessionIdentifier(<Out>
    146. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    147. <PreserveSig>
    148. Function GetSessionInstanceIdentifier(<Out>
    149. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    150. <PreserveSig>
    151. Function GetProcessId(<Out> ByRef pRetVal As Integer) As Integer
    152. <PreserveSig>
    153. Function IsSystemSoundsSession() As Integer
    154. <PreserveSig>
    155. Function SetDuckingPreference(ByVal optOut As Boolean) As Integer
    156. End Interface
    157. End Class

    Bilder
    • ezgif-6-bec44d4892.gif

      100,52 kB, 132×254, 74 mal angesehen

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

    @TomTheCoder15 Schau mal hier rein: Mini-Audio-Manager - System-Sound bedienen
    Und:
    Mach mal in Deinem 1. Post um den Quelltext einen
    Spoiler anzeigen
    Spoiler.
    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!
    Geht das nicht ohne Timer? Z.b. direkt in der Scroll Methode?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo Falsche Herangehensweise.

    TomTheCoder15 schrieb:

    Dieses wir mit einem Timer dessen Intervall auf 1 ist geupdatet.
    1 Millisekunde ist völlig oversized!
    Pack den Code in die Scroll-Prozedur und lösche den Timer ersatzlos.
    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!
    @TomTheCoder15

    Mal ne Frage: Warum registrierst Du nicht einfach per IAudioSessionControl::RegisterAudioSessionNotification das Interface IAudioSessionEvents? Das liefert Dir doch im IAudioSessionEvents::OnChannelVolumeChanged oder im IAudioSessionEvents::OnSimpleVolumeChanged entsprechende Werte in den Events zurück die Du zuvor über IAudioSessionControl oder ISimpleAudioVolume gemacht hast um die Lautstärke zu ändern. Da brauchst keinen Timer oder das Scroll-Event
    Mfg -Franky-
    So läuft es bei mir ohne Probleme

    VB.NET-Quellcode

    1. Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    2. Radio.settings.volume = TrackBar1.Value
    3. Label16.Text = "Lautstärke : " & TrackBar1.Value & ""
    4. Timer1.Enabled = True
    5. Timer1.Start()
    6. Timer1.Interval = 6000
    7. Label16.Visible = True
    8. End Sub
    9. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    10. Label16.Visible = False
    11. interpret.Visible = False
    12. titel.Visible = True
    13. End Sub
    @Andy2002 Ja und?
    Wozu genau brauchst Du da den Timer?
    Ich meine nicht:
    Was machst Du in der Timer.Tick-Prozedur?
    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!

    TomTheCoder15 schrieb:

    11111


    Keine Ahnung, wieso meine erste Antwort nicht richtig übernommen wurde.

    Die Anwendung läuft unflüssig, weil ich (jetzt ohne Timer sondern mit Trackbar.Scroll) bei jeder Änderung die Lautstärke anwende mit :

    Quellcode

    1. SetApplicationSound("discord", VolumeDiscord)


    Eine Möglichkeit wäre, es nicht über das Scroll Event o.Ä anzuwenden, sondern einen Button zu nehmen, der das ganze dann anwendet.
    Ist zwar keine schöne Lösung aber so läuft es im Moment flüssiger.
    @TomTheCoder15 Bei meinem in Post #2 verlinktem AudioManager kannst Du mit dem Slider beliebig schnell hin und her scrollen und der Systemsound folgt völlig ohne Probleme.
    Vielleicht postest Du mal Dein Projekt bereinigt (ohne obj, bin und vs-Verzeichnis) als ZIP.
    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!
    Stimmt, die Antwort hatte ich eigentlich gesendet, ist aber nie angekommen. Dein Projekt ist mit C# und steuert den Master Ausgang. Mit C# kann ich leider gar nichts anfangen :D

    Werde das Projekt vorbereiten und hier posten
    Dateien

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