Partage
  • Partager sur Facebook
  • Partager sur Twitter

Xamarin et l'audio

    17 décembre 2020 à 10:20:13

    Salut à tous

    je rencontre un soucis dans la mise en place de son dans mon application android avec Xamarin.

    l'appli en elle même c'est un genre de jeux Simons. Mon soucis est que les sons ne sont plus audible après quelque lecture, et ils sont aussi plein d'artefact désagréable.

    Je na sais pas d'où viens le soucis, le problème arrive sur l'émulateur android sous visual studio, mais comme je suis novice sur cet IDE et en développement d'appli, j'ai pas compris comment générer un ; APK pour tester sur un smartphone... Dois-je commencer par la?

    Mon test pour y voir plus claire:

    J'ai créé un nouveau projet, avec un bouton, un son. On clique le bouton et le son est lu. jusque là tout va bien, sauf que le sons à des artefacts 3 fois sur 5 environ, et que je peu cliquer qu'une dizaine de fois sur le bouton, après ça, le son n'est plus audible. Si dans l'émulateur je ferme l'appli, et que je la réouvre, le sons est audible de nouveau, une dizaine de fois, puis plus rien.

    le fichier MainActivity.cs

    using System;
    using Android.Content.PM;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    using Android.OS;
    using App1.Droid;
    
    
    //4lines add
    using Android.App;
    using Android.Media;
    using Xamarin.Forms;
    
    [assembly: Dependency(typeof(AudioService))]
    
    
    namespace App1.Droid
    {
        [Activity(Label = "App1", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
        public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
        {
            protected override void OnCreate(Bundle savedInstanceState)
            {
                TabLayoutResource = Resource.Layout.Tabbar;
                ToolbarResource = Resource.Layout.Toolbar;
    
                base.OnCreate(savedInstanceState);
    
                Xamarin.Essentials.Platform.Init(this, savedInstanceState);
                global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
                LoadApplication(new App());
            }
            public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
            {
                Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    
                base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }
    
        //New Class for my audio
        public class AudioService : IAudio
        {
            public AudioService()
            {
            }
    
            public void PlayAudioFile(string fileName)
            {
                var player = new MediaPlayer();
                var fd = global::Android.App.Application.Context.Assets.OpenFd(fileName);
                player.Prepared += (s, e) =>
                {
                    player.Start();
                };
                player.SetDataSource(fd.FileDescriptor, fd.StartOffset, fd.Length);
                player.Prepare();
    
    
    
            }
        }
    }

    le fichier Iaudio

    using System;
    
    namespace App1
    {
    	public interface IAudio
    	{
    		void PlayAudioFile(string fileName);
    	}
    }

    le fichier MainPage.Xaml.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Xamarin.Forms;
    
    namespace App1
    {
        public partial class MainPage : ContentPage
        {
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void Btn_Play_Clicked(object sender, EventArgs e)
            {
                DependencyService.Get<IAudio>().PlayAudioFile("monSon.wav");
            }
        }
    }
    

    et pour fini le fichier MainPage.xaml

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="App1.MainPage">
    
        <StackLayout>
    
            <Button
                x:Name="Btn_Play" 
                Text="Play"
                Clicked="Btn_Play_Clicked" > 
                
            </Button>
            
    
        </StackLayout>
    
    </ContentPage>

    Voila si vous pouviez m'aider j'en serai ravi ;)

    je ne sais pas si je fais les chose dans le bon sens, mon fichier audio monSon.wav est dans le dossier Assets, c'est un petit fichier, un Boom genre grosse caisse de batterie. je ne pense pas que se soit ça le soucis, j'ai tester avec d'autre sons.

    Connaissez-vous un autre moyen de jouer des sons avec Xamarin ? toute mes recherche me donne plus ou moins la même réponse, utiliser DependencyService.Get

    Voila je sais pas quoi vous dire de plus ni quoi faire pour résoudre de problème 

    Merci  bonne journée à vous ;)




    • Partager sur Facebook
    • Partager sur Twitter
      17 décembre 2020 à 16:32:10

      Merci pour la piste ;)

      avec ou sans c'est pareil, j'ai testé un player.Release() aussi juste apres, mais du coup j'ai plus de son, je pense qu'il faudrait la déclencher avec la lecture du son, mais je sais pas trop si on peu tester avec un bool si le son est toujours en lecture. 

      j'ai aussi ces message dans la sorti:

      12-17 15:12:10.267 D/Mono    (27990): Searching for 'java_interop_jnienv_call_long_method_a'.
      12-17 15:12:10.267 D/Mono    (27990): Probing 'java_interop_jnienv_call_long_method_a'.
      12-17 15:12:10.267 D/Mono    (27990): Found as 'java_interop_jnienv_call_long_method_a'.
      12-17 15:12:10.316 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:11.497 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:14.380 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:17.348 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:20.145 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:21.933 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:24.566 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:24.906 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:25.308 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:28.034 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:28.285 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:28.482 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:30.660 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:31.799 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:33.514 D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer
      12-17 15:15:33.604 E/MediaPlayer(27990): error (1, -19)
      12-17 15:15:33.605 E/MediaPlayer(27990): Error (1,-19)

      on vois D/MediaPlayer(27990): setSubtitleAnchor in MediaPlayer aparaitre quand le son est lu, puis systématiquement après quelque essai

      j'ai 

      12-17 15:15:33.604 E/MediaPlayer(27990): error (1, -19)
      12-17 15:15:33.605 E/MediaPlayer(27990): Error (1,-19)

      savez-vous ou trouver de la documentation correspondant ces erreurs?

      • Partager sur Facebook
      • Partager sur Twitter
        18 décembre 2020 à 15:55:55

        le release devrait se faire après avoir lu le son en entier (release libère la ressource utilisée par le Mediaplayer)

        Sinon regarde ce lien (et les liens donnés dans celui-ci qui mènent à l'utilisation de soundpool) https://forums.xamarin.com/discussion/128453/android-media-player-randomly-raises-error-and-doesnt-play/p1

        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2020 à 8:26:38

          Merci pour les lien, j'ai regardé vite fait, j'ai de quoi tester quelque truc.

          notamment passer par un dossier Raw plutôt que le dossier Asset. je vois pas trop pourquoi encore ce serai mieux, mais c'est cool.

          Je verrais ça avec un peu plus de temps, après les fête surement ;)

          • Partager sur Facebook
          • Partager sur Twitter

          Xamarin et l'audio

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown