Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Final version for v2 #206

Merged
merged 2 commits into from
Jan 9, 2025
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
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
Loading