2016-09-09 1 views
0

Je développe une application universelle dans laquelle plusieurs flux audio sont lus simultanément. J'aurais besoin de pouvoir changer le volume de chacun de mes flux séparément. J'ai essayé d'utiliser le MixinSampleProvider, comme le montre le blog entry de Mark Heath, mais je reçois une exception com au démarrage de la lecture (dans MediaFoundationReaderUniversal). Je suis assez nouveau à NAudio donc je suis un peu perdu ici. J'ai déjà beaucoup étudié mais les exemples concernant UWP sont assez rares. Voici ce que j'ai déjà. Quelle est la bonne façon/quelle classe devrais-je utiliser?Lecture de plusieurs fichiers audio avec NAudio dans UWP

C'est ce que j'ai jusqu'à présent:

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path, UriKind.Absolute)); 
var stream = await file.OpenAsync(FileAccessMode.Read); 
var player = new WasapiOutRT(AudioClientShareMode.Shared, 200); 
player.Init(() => { return new MediaFoundationReaderUniversal(stream); }); 
player.Play(); 

Puis-je faire ce que je veux d'une manière compatible avec UWP?

modifier:

c'est l'exception que je reçois, il est à moitié en allemand, mais les parties importantes sont en anglais. La dernière partie dit "Interface non prise en charge":

Unable to cast COM object of type 'System.__ComObject' to interface type 'NAudio.MediaFoundation.IMFSourceReader'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{70AE66F2-C809-4E4F-8915-BDCB406B7993}' failed due to the following error: Schnittstelle nicht unterstützt (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

dans MediaFoundationReader.Read pReader.ReadSample (MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, sur actualStreamIndex, hors dwFlags, hors horodatage, sur Psample);

+0

Quelle est l'exception que vous obtenez? –

+0

[StorageFile.GetFileFromApplicationUriAsync] (https://msdn.microsoft.com/library/windows/apps/windows.storage.storagefile.getfilefromapplicationuriasync.aspx): * « Vous pouvez utiliser cette méthode pour accéder aux ressources de votre application en utilisant soit » ms -appx: // « ou « ms-AppData: // ». URIs » * – IInspectable

+0

@IInspectable: l'ouverture et la lecture des travaux d'actifs, le problème se pose quand je mets un MixinSampleProvider entre le lecteur et le joueur –

Répondre

2

Ok, je l'ai résolu moi-même, le problème est quand j'utilise une fermeture pour la player.Init() Fonction, comme ceci:

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path, UriKind.Absolute)); 
var stream = await file.OpenAsync(FileAccessMode.Read); 
var waveChannel32 = new WaveChannel32(new MediaFoundationReaderUniversal(stream)); 
var mixer = new MixingSampleProvider(new ISampleProvider[] { waveChannel32.ToSampleProvider() }); 

_audioOutput = new WasapiOutRT(AudioClientShareMode.Shared, 200); 
_audioOutput.Init(() => 
{ 
    return mixer.ToWaveProvider(); 
}); 
_audioOutput.Play(); 

lorsque je change le code ci-dessus à cela, aucune exception COM est jeté et le code fonctionne très bien:

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path, UriKind.Absolute)); 
var stream = await file.OpenAsync(FileAccessMode.Read); 

_audioOutput = new WasapiOutRT(AudioClientShareMode.Shared, 200); 
_audioOutput.Init(() => 
{ 
    var waveChannel32 = new WaveChannel32(new MediaFoundationReaderUniversal(stream)); 
    var mixer = new MixingSampleProvider(new ISampleProvider[] { waveChannel32.ToSampleProvider() }); 
    return mixer.ToWaveProvider(); 
}); 
_audioOutput.Play(); 
+0

oui, ce est dû à un problème de threading COM que nous aurions besoin d'une étape de modification IL post-compilation dans NAudio pour résoudre (comme le fait SharpDx) –