Chyba po přehrávání mnoha zvuků po sobě   otázka

VB.NET

ahoj lidi,

mám jednoduchou hru, kde přehrávám mnoho zvuků a taky namluvené hlášky.

Všechny hlášky přehrávám v jednom objektu typu audio, tak že hlášku vždycky před přehrátím načtu:

zvuk = audio.fromfile("hlaska.wav")

zvuk.play

Po nějaké době se ukáže chyba, které nerozumím.

Aplikace spadne.

Jak funguje metoda audio.fromfile?

Není to náhodou tak, že se v paměti vytvoří nový objekt a původní se nesmaže?|

Nedochází náhodou k zahlcení paměti?

Moc se těším na radu.

Lukáš

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A nešlo by to udělat třeba přes komponentu windows media player.

Klikni pravým tlačitkem na Toolbox a dej choose items ,klikni na Com components a tam si najdi windows media player. Pak si ve Form_load nastav axwindowsmediaplayer.visible = false

Jinak kód na přehrání by měl vypadat takto: axwindowsmediaplayer1.url = "hlaska.wav"

Melo by to běhat. Jinak až budu mít ještě večer čas , tak to skusím přes rozhraní DirectX.Nedávno sem to řešil.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Používat k přehrávání COM rozhraní aplikace Windows Media Player je z mnoha důvodů nevhodné řešení. Jednak je to závislost na této aplikaci, potom daleko větší náročnost na systémové prostředky a nakonec zbytečné použití COMu tam, kde to jde pomocí Managed kódu.

Metoda Audio.FromFile pokaždé vytvoří novou instanci objektu Audio, to je pravda. Vzhledem ke Garbage kolekci by nemělo docházet k zahlcení paměti, ovšem při intenzivním vytváření instancí se to stát může. Pokud potřebujete přehrávat několik zvuků současně a zároveň na ně například aplikovat různé efekty, hlasitost, vyvážení a podobně tak k tomu slouží Microsoft.DirectX.DirectSound.SecondaryBuffer. Použití je sice složitější než Audio, ale nabízí pokročilou práci se zvukem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano v tom máte pravdu. Jinak takto sem to řešil já kdysi.

imports Microsoft.DirectX.AudioVideoPlayback
Public Class Form1


    Dim WithEvents audiovideo As Audio

   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
        Timer1.Enabled = True

        audiovideo = New Audio("C:\hlaska.wav")
        audiovideo.Play()

       
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback