Skip to content

Commit

Permalink
Merge pull request #205 from technosf/development
Browse files Browse the repository at this point in the history
Refactoring out some technical debt
  • Loading branch information
technosf authored Jan 9, 2025
2 parents 1fd7104 + 8fb61c1 commit 607d7c4
Show file tree
Hide file tree
Showing 12 changed files with 423 additions and 341 deletions.
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
project (
'com.github.louis77.tuner',
'vala', 'c',
version: '2.0.0-BETA2',
version: '2.0.0',
meson_version: '>= 0.60.0',
)

Expand Down
3 changes: 3 additions & 0 deletions src/Application.vala
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@ namespace Tuner {
public class Application : Gtk.Application
{

/** @brief Signal emitted when the shuffle mode changes */
public signal void shuffle_mode_sig(bool shuffle);

private static Gtk.Settings GTK_SETTINGS;
private static string GTK_SYSTEM_THEME = "unset";
private static string ENV_LANG = "LANGUAGE";
Expand Down
209 changes: 15 additions & 194 deletions src/Controllers/PlayerController.vala
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,14 @@ public class Tuner.PlayerController : GLib.Object
public signal void state_changed_sig (Model.Station station, Is state);

// /** Signal emitted when the title changes. */
public signal void metadata_changed_sig (Model.Station station, Metadata metadata);
public signal void metadata_changed_sig (Model.Station station, Model.Metadata metadata);

/** Signal emitted when the volume changes. */
public signal void volume_changed_sig (double volume);

/** Signal emitted every ten minutes that a station has been playing continuously. */
public signal void tape_counter_sig (Model.Station station);

/** @brief Signal emitted when the shuffle mode changes */
public signal void shuffle_mode_sig(bool shuffle);

/** @brief Signal emitted when the shuffle is requested */
public signal void shuffle_requested_sig();

Expand All @@ -61,7 +58,7 @@ public class Tuner.PlayerController : GLib.Object

private Player _player;
private Model.Station _station;
private Metadata _metadata;
private Model.Metadata _metadata;
private Is _player_state;
private string _player_state_name;
private uint _tape_counter_id = 0;
Expand Down Expand Up @@ -103,7 +100,6 @@ public class Tuner.PlayerController : GLib.Object
set_play_state (state.get_name ());
}
});

} // construct


Expand Down Expand Up @@ -181,7 +177,7 @@ public class Tuner.PlayerController : GLib.Object
});
}
} // set
} // player_state
} // player_state


/**
Expand All @@ -195,7 +191,7 @@ public class Tuner.PlayerController : GLib.Object
set {
if ( ( _station == null ) || ( _station != value ) )
{
_metadata = new Metadata();
_metadata = new Model.Metadata();
_station = value;
play_station (_station);
}
Expand All @@ -213,11 +209,11 @@ public class Tuner.PlayerController : GLib.Object
}


/**
* @brief Plays the specified station.
*
* @param station The station to play.
*/
/**
* @brief Plays the specified station.
*
* @param station The station to play.
*/
public void play_station (Model.Station station)
{
_player.stop ();
Expand Down Expand Up @@ -269,188 +265,13 @@ public class Tuner.PlayerController : GLib.Object
} // stop


/**
* Shuffles the current playlist.
*
* This method randomizes the order of the tracks in the current playlist.
*/
public void shuffle ()
{
shuffle_requested_sig();
} // shuffle

/**
* @class Metadata
*
* @brief Stream Metadata transform
*
*/
public class Metadata : GLib.Object
{
private static string[,] METADATA_TITLES =
// Ordered array of tags and descriptions
{
{"title", _("Title") },
{"artist", _("Artist") },
{"album", _("Album") },
{"image", _("Image") },
{"genre", _("Genre") },
{"homepage", _("Homepage") },
{"organization", _("Organization") },
{"location", _("Location") },
{"extended-comment", _("Extended Comment") },
{"bitrate", _("Bitrate") },
{"audio-codec", _("Audio Codec") },
{"channel-mode", _("Channel Mode") },
{"track-number", _("Track Number") },
{"track-count", _("Track Count") },
{"nominal-bitrate", _("Nominal Bitrate") },
{"minimum-bitrate", _("Minimum Bitrate") },
{"maximum-bitrate", _("Maximim Bitrate") },
{"container-format", ("Container Format") },
{"application-name", _("Application Name") },
{"encoder", _("Encoder") },
{"encoder-version", _("Encoder Version") },
{"datetime", _("Date Time") },
{"private-data", _("Private Data") },
{"has-crc", _("Has CRC") }
};

private static Gee.List<string> METADATA_TAGS = new Gee.ArrayList<string> ();

static construct {

uint8 tag_index = 0;
foreach ( var tag in METADATA_TITLES )
// Replicating the order in METADATA_TITLES
{
if ((tag_index++)%2 == 0)
METADATA_TAGS.insert (tag_index/2, tag );
}
}

public string all_tags { get; private set; default = ""; }
public string title { get; private set; default = ""; }
public string artist { get; private set; default = ""; }
public string image { get; private set; default = ""; }
public string genre { get; private set; default = ""; }
public string homepage { get; private set; default = ""; }
public string audio_info { get; private set; default = ""; }
public string org_loc { get; private set; default = ""; }
public string pretty_print { get; private set; default = ""; }

private Gee.Map<string,string> _metadata_values = new Gee.HashMap<string,string>(); // Hope it come out in order


/**
* Extracts the metadata from the media stream.
*
* @param media_info The media information stream
* @return true if the metadata has changed
*/
internal bool process_media_info_update (PlayerMediaInfo media_info)
{
var streamlist = media_info.get_stream_list ().copy ();

title = "";
artist = "";
image = "";
genre = "";
homepage = "";
audio_info = "";
org_loc = "";
pretty_print = "";

foreach (var stream in streamlist) // Hopefully just one metadata stream
{
var? tags = stream.get_tags (); // Get the raw tags

if (tags == null)
break; // No tags, break on this metadata stream

if (all_tags == tags.to_string ())
return false; // Compare to all tags and if no change return false

all_tags = tags.to_string ();
debug(@"All Tags: $all_tags");

string? s = null;
bool b = false;
uint u = 0;

tags.foreach ((list, tag) =>
{
var index = METADATA_TAGS.index_of (tag);

if (index == -1)
{
warning(@"New meta tag: $tag");
return;
}

var type = (list.get_value_index(tag, 0)).type();

switch (type)
{
case GLib.Type.STRING:
list.get_string(tag, out s);
_metadata_values.set ( tag, s);
break;
case GLib.Type.UINT:
list.get_uint(tag, out u);
if ( u > 1000)
_metadata_values.set ( tag, @"$(u/1000)K");
else
_metadata_values.set ( tag, u.to_string ());
break;
case GLib.Type.BOOLEAN:
list.get_boolean (tag, out b);
_metadata_values.set ( tag, b.to_string ());
break;
default:
warning(@"New Tag type: $(type.name())");
break;
}
}); // tags.foreach

if (_metadata_values.has_key ("title" ))
_title = _metadata_values.get ("title");
if (_metadata_values.has_key ("artist" ))
_artist = _metadata_values.get ("artist");
if (_metadata_values.has_key ("image" ))
_image = _metadata_values.get ("image");
if (_metadata_values.has_key ("genre" ))
_genre = _metadata_values.get ("genre");
if (_metadata_values.has_key ("homepage" ))
_homepage = _metadata_values.get ("homepage");

if (_metadata_values.has_key ("audio_codec" ))
_audio_info = _metadata_values.get ("audio_codec ");
if (_metadata_values.has_key ("bitrate" ))
_audio_info += _metadata_values.get ("bitrate ");
if (_metadata_values.has_key ("channel_mode" ))
_audio_info += _metadata_values.get ("channel_mode");
if (_audio_info != null && _audio_info.length > 0)
_audio_info = safestrip(_audio_info);

if (_metadata_values.has_key ("organization" ))
_org_loc = _metadata_values.get ("organization ");
if (_metadata_values.has_key ("location" ))
_org_loc += _metadata_values.get ("location");
if (_org_loc != null && _org_loc.length > 0)
org_loc = safestrip(_org_loc);

StringBuilder sb = new StringBuilder ();
foreach ( var tag in METADATA_TAGS )
// Pretty print
{
if (_metadata_values.has_key(tag))
{
sb.append ( METADATA_TITLES[METADATA_TAGS.index_of (tag),1])
.append(" : ")
.append( _metadata_values.get (tag))
.append("\n");
}
}
pretty_print = sb.truncate (sb.len-1).str;
} // foreach

return true;
} // process_media_info_update
} // Metadata
} // shuffle
} // PlayerController
2 changes: 1 addition & 1 deletion src/Controllers/SearchController.vala
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ using Gee;
*/
public class Tuner.SearchController : Object
{
private const uint SEARCH_DELAY = 250;
private const uint SEARCH_DELAY = 333;
public signal void search_for_sig(string text);

private DirectoryController _directory;
Expand Down
Loading

0 comments on commit 607d7c4

Please sign in to comment.