Announcement

Collapse
No announcement yet.

WebRadio-App für Win8

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WebRadio-App für Win8

    Hallo zusammen,

    ich habe mal angefangen mit Windows 8 - Apps herumzuspielen und möchte eine simple App zum abspielen eines Webradio-Streams bauen.
    Mein Ergebnis bisher ist aber eher durchwachsen. Ich schaffe es den Stream zu hören und auch zu pausieren, aber Stoppen will einfach nicht gelingen.
    Zudem habe ich ein Threading-Problem, wenn ich über die Keyboard-tasten (zb. Play/Pause) die App ansteuern möchte.

    Mein XAML:
    [highlight=XML]
    <Page
    x:Class="GildeGothicRadio.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:GildeGothicRadio"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>
    <Style x:Name="transportStyle" TargetType="Button">
    <Setter Property="Height" Value="40" />
    <Setter Property="Width" Value="75" />
    <Setter Property="FontSize" Value="11" />
    </Style>
    </Page.Resources>


    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel Name="TransportControlsPanel"
    HorizontalAlignment="Center"
    Grid.Row="1" >
    <MediaElement x:Name="myMedia" Source="http://radio-mmorpg.de:8000" AudioCategory="BackgroundCapableMedia" AutoPlay="False" />
    <StackPanel Orientation="Horizontal">


    <Button Name="btnPlay" Click="btnPlay_Click"
    Style="{StaticResource transportStyle}" Content="Play" />
    <Button Name="btnPause" Click="btnPause_Click"
    Style="{StaticResource transportStyle}" Content="Pause" />
    <Button x:Name="btnStop" Click="btnStop_Click"
    Style="{StaticResource transportStyle}" Content="Stop" Margin="0,364" />
    </StackPanel>
    </StackPanel>
    </Grid>
    </Page>


    [/highlight]

    Und das ist der Code:
    [highlight=c#]
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.Media;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;


    // Die Elementvorlage "Leere Seite" ist unter http://go.microsoft.com/fwlink/?LinkId=234238 dokumentiert.


    namespace GildeGothicRadio
    {
    /// <summary>
    /// Eine leere Seite, die eigenständig verwendet werden kann oder auf die innerhalb eines Rahmens navigiert werden kann.
    /// </summary>
    public sealed partial class MainPage : Page
    {
    public MainPage()
    {
    this.InitializeComponent();
    MediaControl.PlayPressed += MediaControl_PlayPressed;
    MediaControl.PausePressed += MediaControl_PausePressed;
    MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
    MediaControl.StopPressed += MediaControl_StopPressed;
    }


    /// <summary>
    /// Wird aufgerufen, wenn diese Seite in einem Rahmen angezeigt werden soll.
    /// </summary>
    /// <param name="e">Ereignisdaten, die beschreiben, wie diese Seite erreicht wurde. Die
    /// Parametereigenschaft wird normalerweise zum Konfigurieren der Seite verwendet.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    }


    private void MediaControl_StopPressed(object sender, object e)
    {
    myMedia.Stop();
    }


    private void MediaControl_PlayPauseTogglePressed(object sender, object e)
    {
    if (myMedia.CurrentState == MediaElementState.Playing) myMedia.Pause();
    else myMedia.Play();
    }


    private void MediaControl_PausePressed(object sender, object e)
    {
    myMedia.Pause();
    }


    private void MediaControl_PlayPressed(object sender, object e)
    {
    myMedia.Play();
    }


    private void btnPlay_Click(object sender, RoutedEventArgs e)
    {
    //myMedia.Play();
    MediaControl_PlayPressed(sender, e);
    }


    private void btnPause_Click(object sender, RoutedEventArgs e)
    {
    //myMedia.Pause();
    MediaControl_PausePressed(sender, e);
    }


    private void btnStop_Click(object sender, RoutedEventArgs e)
    {
    //myMedia.Stop();
    MediaControl_StopPressed(sender, e);
    }


    }
    }


    [/highlight]

    und ins Manifest hab ich dieses eingetragen:

    [highlight=XML]
    <BackgroundTasks>
    <Task Type="audio" />
    <Task Type="controlChannel" />
    </BackgroundTasks>
    [/highlight]

    Kennt sich da jemand mit aus und kann mir sagen, was ich falsch mache, oder anders machen soll?
    Danke schon mal

    Andreas

  • #2
    Hallo,

    Zudem habe ich ein Threading-Problem, wenn ich über die Keyboard-tasten (zb. Play/Pause) die App ansteuern möchte.
    Kommt eine Fehlermeldung? Wenn ja, welche?

    Der Code schaut soweit gut aus, warum er nicht stoppt weiß ich nicht. Was sagt der Debugger dazu?

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Sorry, die wollte ich noch dazu geschrieben haben.

      Das ist die Fehlermeldung:
      In System.Exception ist eine Ausnahme vom Typ "GildeGothicRadio.exe" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.


      Zusätzliche Informationen: Eine Schnittstelle, die für einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen. (Ausnahme von HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))


      Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.
      Beim betätigen der Stopschaltefläche läuft er ganz normal in das Event rein, über den Stop-Befehl geht er auch fehlerfrei, aber passieren tut nichts.

      Comment


      • #4
        Ich habe was dazu gefunden:

        Callback handlers for theMediaElement element cannot reference the UI thread directly. If you attempt to reference aMediaElement element directly, you will encounter an RPC_E_WRONG_THREAD exception for invoking a call to the element on the wrong thread.
        Ist scheinbar ein bekannter Fehler. Eienen Workaround gibts dort auch. Werd ich mal testen.
        [highlight=c#]
        void receiver_VolumeChangeRequested(Windows.Media.PlayT o.PlayToReceiver sender,
        VolumeChangeRequestedEventArgs args)
        {
        PlayToReceiver.Dispatcher.Helper.BeginInvoke(() =>
        {
        if (dmrVideo != null)
        {
        dmrVideo.Volume = args.Volume;
        }
        });
        }
        [/highlight]

        Comment


        • #5
          Ist scheinbar ein bekannter Fehler.
          Unschön by Design ja. Aber Fehler/Bug eher nicht.

          Comment


          • #6
            Der Workarount hilft mir auch nicht weiter

            Comment


            • #7
              Ok, das Ding mit dem Thread hab ich gelösst.

              So gehts:
              [highlight=C#]
              async void MediaControl_PlayPauseTogglePressed(object sender, object e)
              {
              await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispa tcherPriority.Normal, () =>
              {
              if (myMedia.CurrentState == MediaElementState.Playing)
              {
              myMedia.Pause();
              }
              else
              {
              myMedia.Play();
              }
              }


              );
              }

              [/highlight]


              Bleibt noch die Frage, warum funktioniert STOP nicht.

              Comment

              Working...
              X