2016-03-22 13 views
0

Ben oynuyor bir şarkının geçerli zamanı almaya çalışıyorum, ancak MediaPlayer.PlayPosition.TotalMilliseconds; çağrısı yapıldığında, bir hata atılır kullanarak şarkı PlayPosition alırken:Hata monogame

An unhandled exception of type 'SharpDX.SharpDXException' occurred in SharpDX.dll 

Additional information: 
    HRESULT: [0xC00D9C41], 
    Module: [Unknown], 
    ApiCode: [Unknown/Unknown], 
    Message: Unknown 

Ben c# ve monogame'u öğrenmek ve belki de bariz bir hatayı taahhüt ediyorum.

public static void SpawnArcker(GameTime gametime) 
{ 
    if (MediaPlayer.State != MediaState.Playing) return; 

    elapsedtime += (float) MediaPlayer.PlayPosition.TotalMilliseconds; // <--- HERE 
    //elapsedtime += (float) gametime.ElapsedGameTime.TotalMilliseconds; 
    ... 
} 

Bu böyle asıl döngü güncelleme yönteminde çağrıldığını:

o hatayı atmak kod şudur

protected override void Update(GameTime gameTime) 
{ 
    base.Update(gameTime); 

    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) 
     Exit(); 
    if (Keyboard.GetState().IsKeyDown(Keys.Space)) 
     MediaPlayer.Play(Media.song); 
    SpawnArcker(gameTime); 
    ... 
} 

ben oynuyordum çünkü olsa büyük .wav dosyaları, ancak aynı kısa .mp3 dosyaları ile olur. Yani birisi ilgileniyor eğer

+0

açıklayabilir;'? Oldukça iyi çalışabileceğini düşünüyorum. – J3soon

+1

@ J3soon Merhaba, evet işe yarıyor, ama ben ritim tabanlı bir oyun yapıyorum, ve ben 'gametime.ElapsedGameTime' kullanırsam oyunda geçen her zaman farklı bir şekilde şarkıya sahip olmama rağmen oyunda geçen süreye ihtiyacım var. şarkının geçtiğini düşünmenin daha iyi olacağını düşündüm ... –

cevap

0

...

Bir süre sonra ben (sanırım) Bu hatanın anlamını buldum. this page şöyle der:

0xC00D9C41 
#define MF_E_CLOCK_NO_TIME_SOURCE 
No Presentation Time Source has been specified. 

Sonra, o hata için arama ve this bulundu yazan yere: Medya Oturumu ile MESessionTopologyStatus olayı gönderir kadar

sunum saati geçerli bir zaman dönmez MF_TOPOSTATUS_READY bayrağı. O zamana kadar GetClock, MF_E_CLOCK_NO_TIME_SOURCE'u döndürür.

sanırım şarkısı "çalma" bile, orada henüz almak için hiçbir zaman, bu nedenle bu hata atılır, bu gerçektir (Emphasys eklendi).

Benim için çok fazla, bu yüzden benzer bir işlevselliğe sahip NAudio adlı farklı bir kitaplık kullanmayı denedim, bu nedenle bu kitaplık ile MediaPlayer ile ilgili her şeyi yeniden konumlandırıyorum ve aynı mantıkla, şimdi çalışır. Bu değişikliklerin bazıları yaptığım şudur: `ElapsedTime + = (float) gametime.ElapsedGameTime.TotalMilliseconds kullanmayan neden

public static void SpawnArcker(WaveOutEvent waveOutDevice, Mp3FileReader audioFileReader) 
{ 
    if (waveOutDevice.PlaybackState != PlaybackState.Playing) return; 

    elapsedtime += (float) audioFileReader.CurrentTime.TotalMilliseconds - aux_elapsedtime; 
    aux_elapsedtime = (float) audioFileReader.CurrentTime.TotalMilliseconds; 
    //... rest of code... 
}