Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Documentation/input/reference/api/loadsoundfont.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ Since: 0.9.4

<h2>Description</h2>
<p>
This function initiates a load of the soundfont using the given data. The supported data types is depending on the platform. AlphaTab only supports SoundFont2 encoded soundfonts for loading.
This function initiates a load of the soundfont using the given data. The supported data types is depending on the platform. AlphaTab only supports SoundFont2 encoded soundfonts for loading. To load a soundfont the player must be enabled in advance.

</p>

<h2>Signatures</h2>
Expand Down
1 change: 1 addition & 0 deletions Source/AlphaTab.CSharp/Platform/CSharp/ManagedUiFacade.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ public virtual void InitialRender()
protected abstract void RenderTracks();

public abstract void BeginAppendRenderResults(RenderFinishedEventArgs renderResults);
public abstract void DestroyCursors();
public abstract Cursors CreateCursors();
public abstract void BeginInvoke(Action action);
public abstract void RemoveHighlights();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,10 @@ public override void BeginAppendRenderResults(RenderFinishedEventArgs r)
}


public override void DestroyCursors()
{
}

public override Cursors CreateCursors()
{
// no cursors for winforms, why? - It lacks of proper transparency support
Expand Down
11 changes: 11 additions & 0 deletions Source/AlphaTab.CSharp/Platform/CSharp/Wpf/WpfUiFacade.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
Expand Down Expand Up @@ -191,10 +192,20 @@ public override void BeginAppendRenderResults(RenderFinishedEventArgs r)
r);
}

public override void DestroyCursors()
{
var element = (Panel)((FrameworkElementContainer)Api.CanvasElement).Control.Parent;
var cursors = element.Children.OfType<Canvas>().FirstOrDefault(c => "at-cursors".Equals(c.Tag));
if (cursors != null)
{
element.Children.Remove(cursors);
}
}

public override Cursors CreateCursors()
{
var cursorWrapper = new Canvas();
cursorWrapper.Tag = "at-cursors";
cursorWrapper.HorizontalAlignment = HorizontalAlignment.Left;
cursorWrapper.VerticalAlignment = VerticalAlignment.Top;

Expand Down
16 changes: 15 additions & 1 deletion Source/AlphaTab.JavaScript/UI/BrowserUiFacade.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Runtime.InteropServices;
using AlphaTab.Audio.Synth;
using AlphaTab.Collections;
using AlphaTab.Haxe;
Expand Down Expand Up @@ -649,7 +650,13 @@ public IAlphaSynth CreateWorkerPlayer()
}
else
{
player.Ready += () => { ((AlphaTabApi)_api).LoadSoundFontFromUrl(_api.Settings.SoundFontFile); };
player.Ready += () =>
{
if (!string.IsNullOrEmpty(_api.Settings.SoundFontFile))
{
((AlphaTabApi)_api).LoadSoundFontFromUrl(_api.Settings.SoundFontFile);
}
};
}

return player;
Expand Down Expand Up @@ -680,6 +687,13 @@ public void RemoveHighlights()
}
}

public void DestroyCursors()
{
var element = ((HtmlElementContainer)_api.Container).Element;
var cursorWrapper = element.QuerySelector(".at-cursors");
element.RemoveChild(cursorWrapper);
}

public Cursors CreateCursors()
{
var element = ((HtmlElementContainer)_api.Container).Element;
Expand Down
92 changes: 76 additions & 16 deletions Source/AlphaTab/AlphaTabApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ public AlphaTabApi(IUiFacade<TSettings> uiFacade, TSettings settings)
SetupPlayer();
}

SetupClickHandling();

UiFacade.InitialRender();
}

Expand All @@ -152,6 +154,16 @@ public virtual void Destroy()
public void UpdateSettings()
{
Renderer.UpdateSettings(Settings);

// enable/disable player if needed
if (Settings.EnablePlayer)
{
SetupPlayer();
}
else
{
DestroyPlayer();
}
}

/// <summary>
Expand Down Expand Up @@ -202,7 +214,8 @@ public void RenderScore(Score score, int[] trackIndexes = null)
tracks.Add(score.Tracks[0]);
}
}
if(trackIndexes.Length == 0)

if (trackIndexes.Length == 0)
{
if (score.Tracks.Count > 0)
{
Expand All @@ -219,6 +232,7 @@ public void RenderScore(Score score, int[] trackIndexes = null)
}
}
}

InternalRenderTracks(score, tracks.ToArray());
}

Expand Down Expand Up @@ -271,6 +285,7 @@ private void InternalRenderTracks(Score score, Track[] tracks)
{
_trackIndexes.Add(track.Index);
}

Render();
}
}
Expand Down Expand Up @@ -589,8 +604,25 @@ public bool IsLooping
}
}

private void DestroyPlayer()
{
if (Player == null)
{
return;
}

Player.Destroy();
Player = null;
DestroyCursors();
}

private void SetupPlayer()
{
if (Player != null)
{
return;
}

Player = UiFacade.CreateWorkerPlayer();
if (Player == null)
{
Expand Down Expand Up @@ -634,7 +666,11 @@ private void SetupPlayer()

if (Settings.EnableCursor)
{
SetupCursor();
SetupCursors();
}
else
{
DestroyCursors();
}
}

Expand Down Expand Up @@ -779,14 +815,30 @@ public void Stop()
private int _previousTick;
private PlayerState _playerState;

private BoundsLookup _cursorCache;
private Beat _currentBeat;

private PlayerState _previousStateForCursor;
private BoundsLookup _previousCursorCache;
private int _lastScroll;

private void SetupCursor()
private void DestroyCursors()
{
if (_cursorWrapper == null)
{
return;
}

UiFacade.DestroyCursors();
_cursorWrapper = null;
_barCursor = null;
_beatCursor = null;
_selectionWrapper = null;

_previousTick = 0;
_playerState = PlayerState.Paused;
}

private void SetupCursors()
{
//
// Create cursors
Expand All @@ -812,7 +864,6 @@ private void SetupCursor()
// we need to update our position caches if we render a tablature
Renderer.PostRenderFinished += () =>
{
_cursorCache = Renderer.BoundsLookup;
CursorUpdateTick(_previousTick);
};

Expand All @@ -837,8 +888,6 @@ private void SetupCursor()
}
}
};

SetupClickHandling();
}

/// <summary>
Expand Down Expand Up @@ -876,7 +925,7 @@ private void CursorUpdateBeat(Beat beat, Beat nextBeat, double duration, bool st
return;
}

var cache = _cursorCache;
var cache = Renderer.BoundsLookup;
if (cache == null)
{
return;
Expand Down Expand Up @@ -1055,7 +1104,7 @@ private void SetupClickHandling()
{
CanvasElement.MouseDown += e =>
{
if (!e.IsLeftMouseButton)
if (!e.IsLeftMouseButton || !Settings.EnablePlayer || !Settings.EnableCursor)
{
return;
}
Expand All @@ -1064,7 +1113,7 @@ private void SetupClickHandling()

var relX = e.GetX(CanvasElement);
var relY = e.GetY(CanvasElement);
var beat = _cursorCache.GetBeatAtPos(relX, relY);
var beat = Renderer.BoundsLookup.GetBeatAtPos(relX, relY);
if (beat != null)
{
_selectionStart = new SelectionInfo(beat);
Expand All @@ -1075,14 +1124,14 @@ private void SetupClickHandling()

CanvasElement.MouseMove += e =>
{
if (!_selecting)
if (!_selecting || !Settings.EnablePlayer || !Settings.EnableCursor)
{
return;
}

var relX = e.GetX(CanvasElement);
var relY = e.GetY(CanvasElement);
var beat = _cursorCache.GetBeatAtPos(relX, relY);
var beat = Renderer.BoundsLookup.GetBeatAtPos(relX, relY);
if (beat != null && (_selectionEnd == null || _selectionEnd.Beat != beat))
{
_selectionEnd = new SelectionInfo(beat);
Expand All @@ -1092,7 +1141,7 @@ private void SetupClickHandling()

CanvasElement.MouseUp += e =>
{
if (!_selecting)
if (!_selecting || !Settings.EnablePlayer || !Settings.EnableCursor)
{
return;
}
Expand Down Expand Up @@ -1146,10 +1195,11 @@ private void SetupClickHandling()

Renderer.PostRenderFinished += () =>
{
if (_selectionStart != null)
if (_selectionStart == null || !Settings.EnablePlayer || !Settings.EnableCursor)
{
CursorSelectRange(_selectionStart, _selectionEnd);
return;
}
CursorSelectRange(_selectionStart, _selectionEnd);
};
}

Expand All @@ -1167,7 +1217,7 @@ public virtual void UpdateLayout(LayoutSettings layoutSettings)

private void CursorSelectRange(SelectionInfo startBeat, SelectionInfo endBeat)
{
var cache = _cursorCache;
var cache = Renderer.BoundsLookup;
if (cache == null)
{
return;
Expand Down Expand Up @@ -1376,6 +1426,7 @@ internal void OnError(string type, Exception details)
/// This event is fired when all required data for playback is loaded and ready.
/// </summary>
public event Action ReadyForPlayback;

private void OnReadyForPlayback()
{
var handler = ReadyForPlayback;
Expand All @@ -1391,6 +1442,7 @@ private void OnReadyForPlayback()
/// This event is fired when the playback of the whole song finished.
/// </summary>
public event Action PlayerFinished;

private void OnPlayerFinished()
{
var handler = PlayerFinished;
Expand All @@ -1406,55 +1458,63 @@ private void OnPlayerFinished()
/// This event is fired when the SoundFont needed for playback was loaded.
/// </summary>
public event Action SoundFontLoaded;

private void OnSoundFontLoaded()
{
var handler = SoundFontLoaded;
if (handler != null)
{
handler();
}

UiFacade.TriggerEvent(Container, "soundFontLoaded");
}

/// <summary>
/// This event is fired when the Midi file needed for playback was loaded.
/// </summary>
public event Action MidiLoaded;

private void OnMidiLoaded()
{
var handler = MidiLoaded;
if (handler != null)
{
handler();
}

UiFacade.TriggerEvent(Container, "midiFileLoaded");
}

/// <summary>
/// This event is fired when the playback state changed.
/// </summary>
public event Action<PlayerStateChangedEventArgs> PlayerStateChanged;

private void OnPlayerStateChanged(PlayerStateChangedEventArgs e)
{
var handler = PlayerStateChanged;
if (handler != null)
{
handler(e);
}

UiFacade.TriggerEvent(Container, "playerStateChanged", e);
}

/// <summary>
/// This event is fired when the current playback position of the song changed.
/// </summary>
public event Action<PositionChangedEventArgs> PlayerPositionChanged;

private void OnPlayerPositionChanged(PositionChangedEventArgs e)
{
var handler = PlayerPositionChanged;
if (handler != null)
{
handler(e);
}

UiFacade.TriggerEvent(Container, "positionChanged", e);
}

Expand Down
Loading