Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > dc9b9eb224888fd532330fad8ee0ffc5 > files > 342

audacious-devel-2.4.5-1.fc14.x86_64.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Audacious: playlist-new.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Audacious&#160;<span id="projectnumber">$Id:Doxyfile42802007-03-2104:39:00Znenolod$</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<h1>playlist-new.c</h1>  </div>
</div>
<div class="contents">
<a href="playlist-new_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * playlist-new.c</span>
<a name="l00003"></a>00003 <span class="comment"> * Copyright 2009-2010 John Lindgren</span>
<a name="l00004"></a>00004 <span class="comment"> *</span>
<a name="l00005"></a>00005 <span class="comment"> * This file is part of Audacious.</span>
<a name="l00006"></a>00006 <span class="comment"> *</span>
<a name="l00007"></a>00007 <span class="comment"> * Audacious is free software: you can redistribute it and/or modify it under</span>
<a name="l00008"></a>00008 <span class="comment"> * the terms of the GNU General Public License as published by the Free Software</span>
<a name="l00009"></a>00009 <span class="comment"> * Foundation, version 2 or version 3 of the License.</span>
<a name="l00010"></a>00010 <span class="comment"> *</span>
<a name="l00011"></a>00011 <span class="comment"> * Audacious is distributed in the hope that it will be useful, but WITHOUT ANY</span>
<a name="l00012"></a>00012 <span class="comment"> * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR</span>
<a name="l00013"></a>00013 <span class="comment"> * A PARTICULAR PURPOSE. See the GNU General Public License for more details.</span>
<a name="l00014"></a>00014 <span class="comment"> *</span>
<a name="l00015"></a>00015 <span class="comment"> * You should have received a copy of the GNU General Public License along with</span>
<a name="l00016"></a>00016 <span class="comment"> * Audacious. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00017"></a>00017 <span class="comment"> *</span>
<a name="l00018"></a>00018 <span class="comment"> * The Audacious team does not consider modular code linking to Audacious or</span>
<a name="l00019"></a>00019 <span class="comment"> * using our public API to be a derived work.</span>
<a name="l00020"></a>00020 <span class="comment"> */</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;assert.h&gt;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;inttypes.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;time.h&gt;</span>
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;glib.h&gt;</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;libaudcore/audstrings.h&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;libaudcore/hook.h&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;libaudcore/tuple_formatter.h&gt;</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 <span class="preprocessor">#include &quot;<a class="code" href="audconfig_8h.html">audconfig.h</a>&quot;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &quot;config.h&quot;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &quot;<a class="code" href="i18n_8h.html">i18n.h</a>&quot;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &quot;<a class="code" href="main_8h.html">main.h</a>&quot;</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include &quot;<a class="code" href="misc_8h.html">misc.h</a>&quot;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &quot;<a class="code" href="playback_8h.html">playback.h</a>&quot;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &quot;<a class="code" href="playlist_8h.html">playlist.h</a>&quot;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &quot;<a class="code" href="playlist-utils_8h.html">playlist-utils.h</a>&quot;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &quot;<a class="code" href="plugin_8h.html" title="Main Audacious plugin API header file.">plugin.h</a>&quot;</span>
<a name="l00042"></a>00042 
<a name="l00043"></a><a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">00043</a> <span class="preprocessor">#define SCAN_DEBUG(...)</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
<a name="l00045"></a><a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">00045</a> <span class="preprocessor">#define SCAN_THREADS 4</span>
<a name="l00046"></a><a class="code" href="playlist-new_8c.html#ad234a3a597901e6298cfa77780eb30bf">00046</a> <span class="preprocessor"></span><span class="preprocessor">#define STATE_FILE &quot;playlist-state&quot;</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span>
<a name="l00048"></a><a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">00048</a> <span class="preprocessor">#define DECLARE_PLAYLIST \</span>
<a name="l00049"></a>00049 <span class="preprocessor">    struct playlist * playlist</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span>
<a name="l00051"></a><a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">00051</a> <span class="preprocessor">#define DECLARE_PLAYLIST_ENTRY \</span>
<a name="l00052"></a>00052 <span class="preprocessor">    struct playlist * playlist; \</span>
<a name="l00053"></a>00053 <span class="preprocessor">    struct entry * entry</span>
<a name="l00054"></a>00054 <span class="preprocessor"></span>
<a name="l00055"></a><a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">00055</a> <span class="preprocessor">#define LOOKUP_PLAYLIST \</span>
<a name="l00056"></a>00056 <span class="preprocessor">{ \</span>
<a name="l00057"></a>00057 <span class="preprocessor">    playlist = lookup_playlist (playlist_num); \</span>
<a name="l00058"></a>00058 <span class="preprocessor">    g_return_if_fail (playlist != NULL); \</span>
<a name="l00059"></a>00059 <span class="preprocessor">}</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
<a name="l00061"></a><a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">00061</a> <span class="preprocessor">#define LOOKUP_PLAYLIST_RET(ret) \</span>
<a name="l00062"></a>00062 <span class="preprocessor">{ \</span>
<a name="l00063"></a>00063 <span class="preprocessor">    playlist = lookup_playlist (playlist_num); \</span>
<a name="l00064"></a>00064 <span class="preprocessor">    g_return_val_if_fail (playlist != NULL, ret); \</span>
<a name="l00065"></a>00065 <span class="preprocessor">}</span>
<a name="l00066"></a>00066 <span class="preprocessor"></span>
<a name="l00067"></a><a class="code" href="playlist-new_8c.html#ae6725866bae4b338a90ccda66f01afef">00067</a> <span class="preprocessor">#define LOOKUP_PLAYLIST_ENTRY \</span>
<a name="l00068"></a>00068 <span class="preprocessor">{ \</span>
<a name="l00069"></a>00069 <span class="preprocessor">    playlist = lookup_playlist (playlist_num); \</span>
<a name="l00070"></a>00070 <span class="preprocessor">    g_return_if_fail (playlist != NULL); \</span>
<a name="l00071"></a>00071 <span class="preprocessor">    entry = lookup_entry (playlist, entry_num); \</span>
<a name="l00072"></a>00072 <span class="preprocessor">    g_return_if_fail (entry != NULL); \</span>
<a name="l00073"></a>00073 <span class="preprocessor">}</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span>
<a name="l00075"></a><a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">00075</a> <span class="preprocessor">#define LOOKUP_PLAYLIST_ENTRY_RET(ret) \</span>
<a name="l00076"></a>00076 <span class="preprocessor">{ \</span>
<a name="l00077"></a>00077 <span class="preprocessor">    playlist = lookup_playlist (playlist_num); \</span>
<a name="l00078"></a>00078 <span class="preprocessor">    g_return_val_if_fail (playlist != NULL, ret); \</span>
<a name="l00079"></a>00079 <span class="preprocessor">    entry = lookup_entry (playlist, entry_num); \</span>
<a name="l00080"></a>00080 <span class="preprocessor">    g_return_val_if_fail (entry != NULL, ret); \</span>
<a name="l00081"></a>00081 <span class="preprocessor">}</span>
<a name="l00082"></a>00082 <span class="preprocessor"></span>
<a name="l00083"></a><a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">00083</a> <span class="preprocessor">#define SELECTION_HAS_CHANGED \</span>
<a name="l00084"></a>00084 <span class="preprocessor">{ \</span>
<a name="l00085"></a>00085 <span class="preprocessor">    queue_update (PLAYLIST_UPDATE_SELECTION); \</span>
<a name="l00086"></a>00086 <span class="preprocessor">}</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span>
<a name="l00088"></a><a class="code" href="playlist-new_8c.html#a53eb770c29f70e2a8ef224a89262f6f7">00088</a> <span class="preprocessor">#define METADATA_WILL_CHANGE \</span>
<a name="l00089"></a>00089 <span class="preprocessor">{ \</span>
<a name="l00090"></a>00090 <span class="preprocessor">    scan_stop (); \</span>
<a name="l00091"></a>00091 <span class="preprocessor">}</span>
<a name="l00092"></a>00092 <span class="preprocessor"></span>
<a name="l00093"></a><a class="code" href="playlist-new_8c.html#a2db4a7dc28fa621180952e4170fc5128">00093</a> <span class="preprocessor">#define METADATA_HAS_CHANGED \</span>
<a name="l00094"></a>00094 <span class="preprocessor">{ \</span>
<a name="l00095"></a>00095 <span class="preprocessor">    scan_reset (); \</span>
<a name="l00096"></a>00096 <span class="preprocessor">    queue_update (PLAYLIST_UPDATE_METADATA); \</span>
<a name="l00097"></a>00097 <span class="preprocessor">}</span>
<a name="l00098"></a>00098 <span class="preprocessor"></span>
<a name="l00099"></a><a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">00099</a> <span class="preprocessor">#define PLAYLIST_WILL_CHANGE \</span>
<a name="l00100"></a>00100 <span class="preprocessor">{ \</span>
<a name="l00101"></a>00101 <span class="preprocessor">    scan_stop (); \</span>
<a name="l00102"></a>00102 <span class="preprocessor">}</span>
<a name="l00103"></a>00103 <span class="preprocessor"></span>
<a name="l00104"></a><a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">00104</a> <span class="preprocessor">#define PLAYLIST_HAS_CHANGED \</span>
<a name="l00105"></a>00105 <span class="preprocessor">{ \</span>
<a name="l00106"></a>00106 <span class="preprocessor">    scan_reset (); \</span>
<a name="l00107"></a>00107 <span class="preprocessor">    queue_update (PLAYLIST_UPDATE_STRUCTURE); \</span>
<a name="l00108"></a>00108 <span class="preprocessor">}</span>
<a name="l00109"></a>00109 <span class="preprocessor"></span>
<a name="l00110"></a><a class="code" href="structentry.html">00110</a> <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a>
<a name="l00111"></a>00111 {
<a name="l00112"></a><a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">00112</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>;
<a name="l00113"></a><a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">00113</a>     gchar *<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>;
<a name="l00114"></a><a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">00114</a>     InputPlugin *<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a>;
<a name="l00115"></a><a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">00115</a>     <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> *<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>;
<a name="l00116"></a><a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">00116</a>     gchar *<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a>;
<a name="l00117"></a><a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">00117</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00118"></a><a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">00118</a>     <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a>;
<a name="l00119"></a><a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">00119</a>     <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>;
<a name="l00120"></a><a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">00120</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>;
<a name="l00121"></a><a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">00121</a>     <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a>;
<a name="l00122"></a><a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">00122</a>     <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a>;
<a name="l00123"></a><a class="code" href="structentry.html#a5bf6edf8a827147e29980ab2175ade6a">00123</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#a5bf6edf8a827147e29980ab2175ade6a">start</a>;
<a name="l00124"></a><a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">00124</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">end</a>;
<a name="l00125"></a>00125 };
<a name="l00126"></a>00126 
<a name="l00127"></a><a class="code" href="structplaylist.html">00127</a> <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a>
<a name="l00128"></a>00128 {
<a name="l00129"></a><a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">00129</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">number</a>;
<a name="l00130"></a><a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">00130</a>     gchar *<a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">filename</a>;
<a name="l00131"></a><a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">00131</a>     gchar *<a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">title</a>;
<a name="l00132"></a><a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">00132</a>     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>;
<a name="l00133"></a><a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">00133</a>     <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>;
<a name="l00134"></a><a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">00134</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a>;
<a name="l00135"></a><a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">00135</a>     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a>;
<a name="l00136"></a><a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">00136</a>     GList *<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>;
<a name="l00137"></a><a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">00137</a>     gint64 <a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a>;
<a name="l00138"></a><a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">00138</a>     gint64 <a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a>;
<a name="l00139"></a>00139 };
<a name="l00140"></a>00140 
<a name="l00141"></a><a class="code" href="playlist-new_8c.html#ae9bb6d03717891be4859bb35adcea142">00141</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *<a class="code" href="playlist-new_8c.html#ae9bb6d03717891be4859bb35adcea142">playlists</a>;
<a name="l00142"></a><a class="code" href="playlist-new_8c.html#aeedba064cd0bdbac99c741c623dbcd9e">00142</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="playlist-new_8c.html#aeedba064cd0bdbac99c741c623dbcd9e">active_playlist</a>;
<a name="l00143"></a><a class="code" href="playlist-new_8c.html#a10acb61156324fa4c2d818fc655da621">00143</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="playlist-new_8c.html#a10acb61156324fa4c2d818fc655da621">playing_playlist</a>;
<a name="l00144"></a>00144 
<a name="l00145"></a><a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">00145</a> <span class="keyword">static</span> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a>, <a class="code" href="playlist-new_8c.html#a327e782ad2e8093024de9d68ea9a9b73">update_level</a>;
<a name="l00146"></a><a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">00146</a> <span class="keyword">static</span> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a>;
<a name="l00147"></a><a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">00147</a> <span class="keyword">static</span> GMutex * <a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>;
<a name="l00148"></a><a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">00148</a> <span class="keyword">static</span> GCond * <a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[<a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>];
<a name="l00149"></a><a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">00149</a> <span class="keyword">static</span> <span class="keyword">const</span> gchar * <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[<a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>];
<a name="l00150"></a><a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">00150</a> <span class="keyword">static</span> InputPlugin * <a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>[<a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>];
<a name="l00151"></a><a class="code" href="playlist-new_8c.html#a2e59e59c12a80245cfaadccc31db7eec">00151</a> <span class="keyword">static</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="playlist-new_8c.html#a2e59e59c12a80245cfaadccc31db7eec">scan_tuples</a>[<a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>];
<a name="l00152"></a><a class="code" href="playlist-new_8c.html#a774be9656da41194a0e3457c3b4be511">00152</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a774be9656da41194a0e3457c3b4be511">scan_quit</a>;
<a name="l00153"></a><a class="code" href="playlist-new_8c.html#a46b34cea34c84c91444105620d048882">00153</a> <span class="keyword">static</span> GThread * <a class="code" href="playlist-new_8c.html#a46b34cea34c84c91444105620d048882">scan_threads</a>[<a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>];
<a name="l00154"></a><a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">00154</a> <span class="keyword">static</span> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[<a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>];
<a name="l00155"></a><a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">00155</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">updated_ago</a>;
<a name="l00156"></a>00156 
<a name="l00157"></a>00157 <span class="keyword">static</span> <span class="keywordtype">void</span> * <a class="code" href="playlist-new_8c.html#a3b244552b44a9efb864929586515e565">scanner</a> (<span class="keywordtype">void</span> * unused);
<a name="l00158"></a>00158 
<a name="l00159"></a><a class="code" href="playlist-new_8c.html#a9f16d45c1933eff4ef662b022ec2b73f">00159</a> <span class="keyword">static</span> gchar *<a class="code" href="playlist-new_8c.html#a9f16d45c1933eff4ef662b022ec2b73f">title_from_tuple</a>(<a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * tuple)
<a name="l00160"></a>00160 {
<a name="l00161"></a>00161     <span class="keyword">const</span> gchar *<a class="code" href="audio_8c.html#ac28b2a605e4f23336825cff9ed49d31e">format</a> = <a class="code" href="tuple_8c.html#a7a653c534853fc3bd9afd9b6be96e25a" title="Returns pointer to a string associated to Tuple field.">tuple_get_string</a>(tuple, <a class="code" href="tuple_8h.html#a99fb83031ce9923c84392b4e92f956b5ace9793790de08b151912c0bdf36474e9" title="Playlist entry Tuplez formatting string.">FIELD_FORMATTER</a>, NULL);
<a name="l00162"></a>00162 
<a name="l00163"></a>00163     <span class="keywordflow">if</span> (format == NULL)
<a name="l00164"></a>00164         format = <a class="code" href="playlist-utils_8c.html#ad92e302987c4d38af791b5ad026ac3c9">get_gentitle_format</a>();
<a name="l00165"></a>00165 
<a name="l00166"></a>00166     <span class="keywordflow">return</span> <a class="code" href="tuple__formatter_8c.html#a0c4f98eba6c50b14af715d3fb24db996">tuple_formatter_make_title_string</a>(tuple, format);
<a name="l00167"></a>00167 }
<a name="l00168"></a>00168 
<a name="l00169"></a><a class="code" href="playlist-new_8c.html#a92c0cdd3fdbbf9cba3b53d938c25694e">00169</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a92c0cdd3fdbbf9cba3b53d938c25694e">entry_set_tuple_real</a> (<span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a>, <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * tuple)
<a name="l00170"></a>00170 {
<a name="l00171"></a>00171     <span class="comment">/* Hack: We cannot refresh segmented entries (since their info is read from</span>
<a name="l00172"></a>00172 <span class="comment">     * the cue sheet when it is first loaded), so leave them alone. -jlindgren */</span>
<a name="l00173"></a>00173     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a>)
<a name="l00174"></a>00174     {
<a name="l00175"></a>00175         <span class="keywordflow">if</span> (tuple != NULL)
<a name="l00176"></a>00176             <a class="code" href="tuple_8h.html#a975e29105dbaa18ad44c05a2a43a6d8d">tuple_free</a> (tuple);
<a name="l00177"></a>00177 
<a name="l00178"></a>00178         <span class="keywordflow">return</span>;
<a name="l00179"></a>00179     }
<a name="l00180"></a>00180 
<a name="l00181"></a>00181     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a> != NULL)
<a name="l00182"></a>00182         <a class="code" href="tuple_8h.html#a975e29105dbaa18ad44c05a2a43a6d8d">tuple_free</a> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>);
<a name="l00183"></a>00183 
<a name="l00184"></a>00184     g_free (entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a>);
<a name="l00185"></a>00185     entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a> = tuple;
<a name="l00186"></a>00186 
<a name="l00187"></a>00187     <span class="keywordflow">if</span> (tuple == NULL)
<a name="l00188"></a>00188     {
<a name="l00189"></a>00189         entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a> = NULL;
<a name="l00190"></a>00190         entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a> = 0;
<a name="l00191"></a>00191         entry-&gt;<a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a> = FALSE;
<a name="l00192"></a>00192         entry-&gt;<a class="code" href="structentry.html#a5bf6edf8a827147e29980ab2175ade6a">start</a> = entry-&gt;<a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">end</a> = -1;
<a name="l00193"></a>00193     }
<a name="l00194"></a>00194     <span class="keywordflow">else</span>
<a name="l00195"></a>00195     {
<a name="l00196"></a>00196         entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a> = <a class="code" href="playlist-new_8c.html#a9f16d45c1933eff4ef662b022ec2b73f">title_from_tuple</a> (tuple);
<a name="l00197"></a>00197         entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a> = <a class="code" href="tuple_8c.html#a5a0ca1037b697bb8d8e2cb866dcd5531" title="Returns integer associated to Tuple field.">tuple_get_int</a> (tuple, <a class="code" href="tuple_8h.html#a99fb83031ce9923c84392b4e92f956b5a976de08f9a7d2557abdae42285bd6e40" title="Track length in seconds.">FIELD_LENGTH</a>, NULL);
<a name="l00198"></a>00198         entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a> = MAX (entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>, 0);
<a name="l00199"></a>00199 
<a name="l00200"></a>00200         <span class="keywordflow">if</span> (<a class="code" href="tuple_8c.html#a5f7f6ce621bc1bf67a4a93a0877e8dc6" title="Returns TupleValueType of given Tuple field.">tuple_get_value_type</a> (tuple, <a class="code" href="tuple_8h.html#a99fb83031ce9923c84392b4e92f956b5a061bd2f02106448271b63704e179865c">FIELD_SEGMENT_START</a>, NULL) == <a class="code" href="tuple_8h.html#a7c30590e28255832d324bbeccc6a7b93ad691daf1df77095c1e19fe30b6cea5b4">TUPLE_INT</a>)
<a name="l00201"></a>00201         {
<a name="l00202"></a>00202             entry-&gt;<a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a> = TRUE;
<a name="l00203"></a>00203             entry-&gt;<a class="code" href="structentry.html#a5bf6edf8a827147e29980ab2175ade6a">start</a> = <a class="code" href="tuple_8c.html#a5a0ca1037b697bb8d8e2cb866dcd5531" title="Returns integer associated to Tuple field.">tuple_get_int</a> (tuple, <a class="code" href="tuple_8h.html#a99fb83031ce9923c84392b4e92f956b5a061bd2f02106448271b63704e179865c">FIELD_SEGMENT_START</a>, NULL);
<a name="l00204"></a>00204 
<a name="l00205"></a>00205             <span class="keywordflow">if</span> (<a class="code" href="tuple_8c.html#a5f7f6ce621bc1bf67a4a93a0877e8dc6" title="Returns TupleValueType of given Tuple field.">tuple_get_value_type</a> (tuple, <a class="code" href="tuple_8h.html#a99fb83031ce9923c84392b4e92f956b5adc4f03ce756a2b7b32011ec3b2929044">FIELD_SEGMENT_END</a>, NULL) ==
<a name="l00206"></a>00206              <a class="code" href="tuple_8h.html#a7c30590e28255832d324bbeccc6a7b93ad691daf1df77095c1e19fe30b6cea5b4">TUPLE_INT</a>)
<a name="l00207"></a>00207                 entry-&gt;<a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">end</a> = <a class="code" href="tuple_8c.html#a5a0ca1037b697bb8d8e2cb866dcd5531" title="Returns integer associated to Tuple field.">tuple_get_int</a> (tuple, <a class="code" href="tuple_8h.html#a99fb83031ce9923c84392b4e92f956b5adc4f03ce756a2b7b32011ec3b2929044">FIELD_SEGMENT_END</a>, NULL);
<a name="l00208"></a>00208             <span class="keywordflow">else</span>
<a name="l00209"></a>00209                 entry-&gt;<a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">end</a> = -1;
<a name="l00210"></a>00210         }
<a name="l00211"></a>00211         <span class="keywordflow">else</span>
<a name="l00212"></a>00212             entry-&gt;<a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a> = FALSE;
<a name="l00213"></a>00213     }
<a name="l00214"></a>00214 }
<a name="l00215"></a>00215 
<a name="l00216"></a><a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">00216</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a>,
<a name="l00217"></a>00217  <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * tuple)
<a name="l00218"></a>00218 {
<a name="l00219"></a>00219     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a> != NULL)
<a name="l00220"></a>00220     {
<a name="l00221"></a>00221         playlist-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a> -= entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00222"></a>00222 
<a name="l00223"></a>00223         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l00224"></a>00224             playlist-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> -= entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00225"></a>00225     }
<a name="l00226"></a>00226 
<a name="l00227"></a>00227     <a class="code" href="playlist-new_8c.html#a92c0cdd3fdbbf9cba3b53d938c25694e">entry_set_tuple_real</a> (entry, tuple);
<a name="l00228"></a>00228 
<a name="l00229"></a>00229     <span class="keywordflow">if</span> (tuple != NULL)
<a name="l00230"></a>00230     {
<a name="l00231"></a>00231         playlist-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a> += entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00232"></a>00232 
<a name="l00233"></a>00233         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l00234"></a>00234             playlist-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> += entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00235"></a>00235     }
<a name="l00236"></a>00236 }
<a name="l00237"></a>00237 
<a name="l00238"></a><a class="code" href="playlist-new_8c.html#af9cbb817baea1b6ea3bea9fedffafd6d">00238</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#af9cbb817baea1b6ea3bea9fedffafd6d">entry_set_failed</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a>)
<a name="l00239"></a>00239 {
<a name="l00240"></a>00240     <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (playlist, entry, <a class="code" href="tuple_8c.html#abe12ea9fb8c4713337cbe6f1bbab79f4" title="Allocates a new Tuple structure, setting filename/URI related fields based on the given filename argu...">tuple_new_from_filename</a> (entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>));
<a name="l00241"></a>00241     entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a> = TRUE;
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243 
<a name="l00244"></a><a class="code" href="playlist-new_8c.html#a6c7e5f920b20073d72ea9edc7cde1fe7">00244</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="playlist-new_8c.html#a6c7e5f920b20073d72ea9edc7cde1fe7">entry_new</a>(gchar * <a class="code" href="misc-api_8h.html#a820d8643bcfa9e2641dd6377f804de20">filename</a>, InputPlugin * <a class="code" href="misc-api_8h.html#a223c76d43f12031a46d1f35c744332fa">decoder</a>, <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>)
<a name="l00245"></a>00245 {
<a name="l00246"></a>00246     <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = g_malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> entry));
<a name="l00247"></a>00247 
<a name="l00248"></a>00248     entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a> = <a class="code" href="misc-api_8h.html#a820d8643bcfa9e2641dd6377f804de20">filename</a>;
<a name="l00249"></a>00249     entry-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a> = <a class="code" href="misc-api_8h.html#a223c76d43f12031a46d1f35c744332fa">decoder</a>;
<a name="l00250"></a>00250     entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a> = NULL;
<a name="l00251"></a>00251     entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a> = NULL;
<a name="l00252"></a>00252     entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a> = FALSE;
<a name="l00253"></a>00253     entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> = -1;
<a name="l00254"></a>00254     entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a> = FALSE;
<a name="l00255"></a>00255     entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> = 0;
<a name="l00256"></a>00256     entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a> = FALSE;
<a name="l00257"></a>00257     entry-&gt;<a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a> = FALSE;
<a name="l00258"></a>00258     entry-&gt;<a class="code" href="structentry.html#a5bf6edf8a827147e29980ab2175ade6a">start</a> = entry-&gt;<a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">end</a> = -1;
<a name="l00259"></a>00259 
<a name="l00260"></a>00260     <a class="code" href="playlist-new_8c.html#a92c0cdd3fdbbf9cba3b53d938c25694e">entry_set_tuple_real</a> (entry, tuple);
<a name="l00261"></a>00261     <span class="keywordflow">return</span> <a class="code" href="playlist-api_8h.html#abaa108414cc2c74407885fb19e375eb7">entry</a>;
<a name="l00262"></a>00262 }
<a name="l00263"></a>00263 
<a name="l00264"></a><a class="code" href="playlist-new_8c.html#ace274769168158e771e7266a3c04e5a9">00264</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ace274769168158e771e7266a3c04e5a9">entry_free</a>(<span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a>)
<a name="l00265"></a>00265 {
<a name="l00266"></a>00266     g_free(entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>);
<a name="l00267"></a>00267 
<a name="l00268"></a>00268     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a> != NULL)
<a name="l00269"></a>00269         <a class="code" href="tuple_8h.html#a975e29105dbaa18ad44c05a2a43a6d8d">tuple_free</a>(entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>);
<a name="l00270"></a>00270 
<a name="l00271"></a>00271     g_free(entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a>);
<a name="l00272"></a>00272     g_free(entry);
<a name="l00273"></a>00273 }
<a name="l00274"></a>00274 
<a name="l00275"></a><a class="code" href="playlist-new_8c.html#addafbb017bae32d49d15531975f7b5b5">00275</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#addafbb017bae32d49d15531975f7b5b5">entry_check_has_decoder</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> *
<a name="l00276"></a>00276  <a class="code" href="structentry.html">entry</a>)
<a name="l00277"></a>00277 {
<a name="l00278"></a>00278     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a> != NULL || entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a>)
<a name="l00279"></a>00279         <span class="keywordflow">return</span>;
<a name="l00280"></a>00280 
<a name="l00281"></a>00281     entry-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a> = <a class="code" href="misc-api_8h.html#a6769ae60103bd67203a66c2eceeccffc">file_find_decoder</a> (entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>, FALSE);
<a name="l00282"></a>00282     <span class="keywordflow">if</span> (! entry-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a>)
<a name="l00283"></a>00283         <a class="code" href="playlist-new_8c.html#af9cbb817baea1b6ea3bea9fedffafd6d">entry_set_failed</a> (playlist, entry);
<a name="l00284"></a>00284 }
<a name="l00285"></a>00285 
<a name="l00286"></a><a class="code" href="playlist-new_8c.html#a89e952132fe0a4cede0de22c0aced287">00286</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="playlist-new_8c.html#a89e952132fe0a4cede0de22c0aced287">playlist_new</a>(<span class="keywordtype">void</span>)
<a name="l00287"></a>00287 {
<a name="l00288"></a>00288     <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="structplaylist.html">playlist</a> = g_malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> playlist));
<a name="l00289"></a>00289 
<a name="l00290"></a>00290     playlist-&gt;<a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">number</a> = -1;
<a name="l00291"></a>00291     playlist-&gt;<a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">filename</a> = NULL;
<a name="l00292"></a>00292     playlist-&gt;<a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">title</a> = g_strdup(<a class="code" href="i18n_8h.html#a32a3cf3d9dd914f5aeeca5423c157934">_</a>(<span class="stringliteral">&quot;Untitled Playlist&quot;</span>));
<a name="l00293"></a>00293     playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a> = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l00294"></a>00294     playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> = NULL;
<a name="l00295"></a>00295     playlist-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a> = 0;
<a name="l00296"></a>00296     playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a> = 0;
<a name="l00297"></a>00297     playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = NULL;
<a name="l00298"></a>00298     playlist-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a> = 0;
<a name="l00299"></a>00299     playlist-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> = 0;
<a name="l00300"></a>00300 
<a name="l00301"></a>00301     <span class="keywordflow">return</span> <a class="code" href="playlist-api_8h.html#a215ca45f357a38d7cbbac627bf81b9de">playlist</a>;
<a name="l00302"></a>00302 }
<a name="l00303"></a>00303 
<a name="l00304"></a><a class="code" href="playlist-new_8c.html#a0197d23bf9e5ceaac2ae19532c94ee6d">00304</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a0197d23bf9e5ceaac2ae19532c94ee6d">playlist_free</a>(<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="structplaylist.html">playlist</a>)
<a name="l00305"></a>00305 {
<a name="l00306"></a>00306     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00307"></a>00307 
<a name="l00308"></a>00308     g_free(playlist-&gt;<a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">filename</a>);
<a name="l00309"></a>00309     g_free(playlist-&gt;<a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">title</a>);
<a name="l00310"></a>00310 
<a name="l00311"></a>00311     <span class="keywordflow">for</span> (count = 0; count &lt; <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>); count++)
<a name="l00312"></a>00312         <a class="code" href="playlist-new_8c.html#ace274769168158e771e7266a3c04e5a9">entry_free</a>(<a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count));
<a name="l00313"></a>00313 
<a name="l00314"></a>00314     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00315"></a>00315     g_list_free(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>);
<a name="l00316"></a>00316     g_free(playlist);
<a name="l00317"></a>00317 }
<a name="l00318"></a>00318 
<a name="l00319"></a><a class="code" href="playlist-new_8c.html#ad7db14a4cba25f23c9ad7107ae4ecab6">00319</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ad7db14a4cba25f23c9ad7107ae4ecab6">number_playlists</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> length)
<a name="l00320"></a>00320 {
<a name="l00321"></a>00321     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00322"></a>00322 
<a name="l00323"></a>00323     <span class="keywordflow">for</span> (count = 0; count &lt; length; count++)
<a name="l00324"></a>00324     {
<a name="l00325"></a>00325         <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="structplaylist.html">playlist</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlists, at + count);
<a name="l00326"></a>00326 
<a name="l00327"></a>00327         playlist-&gt;<a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">number</a> = at + <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00328"></a>00328     }
<a name="l00329"></a>00329 }
<a name="l00330"></a>00330 
<a name="l00331"></a><a class="code" href="playlist-new_8c.html#ac5e719f82fff28cc73b59c4e7543f1bd">00331</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="playlist-new_8c.html#ac5e719f82fff28cc73b59c4e7543f1bd">lookup_playlist</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00332"></a>00332 {
<a name="l00333"></a>00333     <span class="keywordflow">if</span> (playlist_num &lt; 0 || playlist_num &gt;= <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists))
<a name="l00334"></a>00334         <span class="keywordflow">return</span> NULL;
<a name="l00335"></a>00335 
<a name="l00336"></a>00336     <span class="keywordflow">return</span> <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlists, playlist_num);
<a name="l00337"></a>00337 }
<a name="l00338"></a>00338 
<a name="l00339"></a><a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">00339</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> length)
<a name="l00340"></a>00340 {
<a name="l00341"></a>00341     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00342"></a>00342 
<a name="l00343"></a>00343     <span class="keywordflow">for</span> (count = 0; count &lt; length; count++)
<a name="l00344"></a>00344     {
<a name="l00345"></a>00345         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, at + count);
<a name="l00346"></a>00346 
<a name="l00347"></a>00347         entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> = at + <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00348"></a>00348     }
<a name="l00349"></a>00349 }
<a name="l00350"></a>00350 
<a name="l00351"></a><a class="code" href="playlist-new_8c.html#ab5fcffaaf3427b49ba833f7c88ee4509">00351</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="playlist-new_8c.html#ab5fcffaaf3427b49ba833f7c88ee4509">lookup_entry</a>(<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> *<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l00352"></a>00352 {
<a name="l00353"></a>00353     <span class="keywordflow">if</span> (entry_num &lt; 0 || entry_num &gt;= <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>))
<a name="l00354"></a>00354         <span class="keywordflow">return</span> NULL;
<a name="l00355"></a>00355 
<a name="l00356"></a>00356     <span class="keywordflow">return</span> <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, entry_num);
<a name="l00357"></a>00357 }
<a name="l00358"></a>00358 
<a name="l00359"></a><a class="code" href="playlist-new_8c.html#a0e28bfc1f258f91104a1177d032474cb">00359</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a0e28bfc1f258f91104a1177d032474cb">update</a> (<span class="keywordtype">void</span> * unused)
<a name="l00360"></a>00360 {
<a name="l00361"></a>00361     <a class="code" href="hook_8c.html#a2db1ccd2efbd82b151393e3aedd42550">hook_call</a> (<span class="stringliteral">&quot;playlist update&quot;</span>, GINT_TO_POINTER (<a class="code" href="playlist-new_8c.html#a327e782ad2e8093024de9d68ea9a9b73">update_level</a>));
<a name="l00362"></a>00362 
<a name="l00363"></a>00363     <a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a> = 0;
<a name="l00364"></a>00364     <a class="code" href="playlist-new_8c.html#a327e782ad2e8093024de9d68ea9a9b73">update_level</a> = 0;
<a name="l00365"></a>00365     <span class="keywordflow">return</span> FALSE;
<a name="l00366"></a>00366 }
<a name="l00367"></a>00367 
<a name="l00368"></a><a class="code" href="playlist-new_8c.html#a0a10236264f6e8b187b9977de3e57286">00368</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a0a10236264f6e8b187b9977de3e57286">queue_update</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> level)
<a name="l00369"></a>00369 {
<a name="l00370"></a>00370     <a class="code" href="playlist-new_8c.html#a327e782ad2e8093024de9d68ea9a9b73">update_level</a> = MAX (<a class="code" href="playlist-new_8c.html#a327e782ad2e8093024de9d68ea9a9b73">update_level</a>, level);
<a name="l00371"></a>00371 
<a name="l00372"></a>00372     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a> == 0)
<a name="l00373"></a>00373         <a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a> = g_idle_add_full (G_PRIORITY_HIGH_IDLE, <a class="code" href="playlist-new_8c.html#a0e28bfc1f258f91104a1177d032474cb">update</a>, NULL,
<a name="l00374"></a>00374          NULL);
<a name="l00375"></a>00375 }
<a name="l00376"></a>00376 
<a name="l00377"></a>00377 <span class="comment">/* scan_mutex must be locked! */</span>
<a name="l00378"></a><a class="code" href="playlist-new_8c.html#ab15ce1a0b7c36cbaf4bf601d32a5b256">00378</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ab15ce1a0b7c36cbaf4bf601d32a5b256">scan_receive</a> (<span class="keywordtype">void</span>)
<a name="l00379"></a>00379 {
<a name="l00380"></a>00380     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00381"></a>00381     {
<a name="l00382"></a>00382         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="playlist-api_8h.html#abaa108414cc2c74407885fb19e375eb7">entry</a>;
<a name="l00383"></a>00383 
<a name="l00384"></a>00384         <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i] || <a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>[i])
<a name="l00385"></a>00385             <span class="keywordflow">continue</span>; <span class="comment">/* thread not in use or still working */</span>
<a name="l00386"></a>00386 
<a name="l00387"></a>00387         <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;receive (#%d): %d\n&quot;</span>, i, <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[i]);
<a name="l00388"></a>00388         entry = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (active_playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[i]);
<a name="l00389"></a>00389 
<a name="l00390"></a>00390         <span class="keywordflow">if</span> (scan_tuples[i])
<a name="l00391"></a>00391             <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (active_playlist, entry, scan_tuples[i]);
<a name="l00392"></a>00392         <span class="keywordflow">else</span>
<a name="l00393"></a>00393             <a class="code" href="playlist-new_8c.html#af9cbb817baea1b6ea3bea9fedffafd6d">entry_set_failed</a> (active_playlist, entry);
<a name="l00394"></a>00394 
<a name="l00395"></a>00395         <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i] = NULL;
<a name="l00396"></a>00396         scan_tuples[i] = NULL;
<a name="l00397"></a>00397 
<a name="l00398"></a>00398         <a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">updated_ago</a> ++;
<a name="l00399"></a>00399     }
<a name="l00400"></a>00400 }
<a name="l00401"></a>00401 
<a name="l00402"></a><a class="code" href="playlist-new_8c.html#a75739596484dc0db901d1289d231e7f7">00402</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a75739596484dc0db901d1289d231e7f7">scan_next</a> (<span class="keywordtype">void</span> * unused)
<a name="l00403"></a>00403 {
<a name="l00404"></a>00404     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (active_playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00405"></a>00405     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> search = 0;
<a name="l00406"></a>00406 
<a name="l00407"></a>00407     g_mutex_lock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00408"></a>00408 
<a name="l00409"></a>00409     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a>)
<a name="l00410"></a>00410     {
<a name="l00411"></a>00411         g_source_remove (<a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a>);
<a name="l00412"></a>00412         <a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a> = 0;
<a name="l00413"></a>00413     }
<a name="l00414"></a>00414 
<a name="l00415"></a>00415     <a class="code" href="playlist-new_8c.html#ab15ce1a0b7c36cbaf4bf601d32a5b256">scan_receive</a> ();
<a name="l00416"></a>00416 
<a name="l00417"></a>00417     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00418"></a>00418         search = MAX (search, <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[i] + 1);
<a name="l00419"></a>00419 
<a name="l00420"></a>00420     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00421"></a>00421     {
<a name="l00422"></a>00422         <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i])
<a name="l00423"></a>00423             <span class="keywordflow">continue</span>; <span class="comment">/* thread already in use */</span>
<a name="l00424"></a>00424 
<a name="l00425"></a>00425         <span class="keywordflow">for</span> (; search &lt; entries; search ++)
<a name="l00426"></a>00426         {
<a name="l00427"></a>00427             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (active_playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, search);
<a name="l00428"></a>00428 
<a name="l00429"></a>00429             <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>)
<a name="l00430"></a>00430                 <span class="keywordflow">continue</span>;
<a name="l00431"></a>00431 
<a name="l00432"></a>00432             <a class="code" href="playlist-new_8c.html#addafbb017bae32d49d15531975f7b5b5">entry_check_has_decoder</a> (active_playlist, entry);
<a name="l00433"></a>00433             <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a>)
<a name="l00434"></a>00434                 <span class="keywordflow">continue</span>;
<a name="l00435"></a>00435 
<a name="l00436"></a>00436             <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;start (#%d): %d\n&quot;</span>, i, search);
<a name="l00437"></a>00437             <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[i] = search;
<a name="l00438"></a>00438             <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i] = entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>;
<a name="l00439"></a>00439             <a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>[i] = entry-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a>;
<a name="l00440"></a>00440             g_cond_signal (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i]);
<a name="l00441"></a>00441 
<a name="l00442"></a>00442             search ++;
<a name="l00443"></a>00443             <span class="keywordflow">break</span>;
<a name="l00444"></a>00444         }
<a name="l00445"></a>00445     }
<a name="l00446"></a>00446 
<a name="l00447"></a>00447     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">updated_ago</a> &gt;= 10 || (search == entries &amp;&amp; <a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">updated_ago</a> &gt; 0))
<a name="l00448"></a>00448     {
<a name="l00449"></a>00449         <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;queue update\n&quot;</span>);
<a name="l00450"></a>00450         <a class="code" href="playlist-new_8c.html#a0a10236264f6e8b187b9977de3e57286">queue_update</a> (<a class="code" href="playlist_8h.html#abc5c98fcc1211af2b80116dd6e0a035da7baed2f89f9043bab7b82c4eefe0bd7a">PLAYLIST_UPDATE_METADATA</a>);
<a name="l00451"></a>00451         <a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">updated_ago</a> = 0;
<a name="l00452"></a>00452     }
<a name="l00453"></a>00453 
<a name="l00454"></a>00454     g_mutex_unlock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00455"></a>00455     <span class="keywordflow">return</span> FALSE;
<a name="l00456"></a>00456 }
<a name="l00457"></a>00457 
<a name="l00458"></a><a class="code" href="playlist-new_8c.html#a088f0baf108d439bcc815d852b9c7b33">00458</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a088f0baf108d439bcc815d852b9c7b33">scan_continue</a> (<span class="keywordtype">void</span>)
<a name="l00459"></a>00459 {
<a name="l00460"></a>00460     <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scan_continue\n&quot;</span>);
<a name="l00461"></a>00461     <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a>)
<a name="l00462"></a>00462         <a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a> = g_idle_add_full (G_PRIORITY_LOW, <a class="code" href="playlist-new_8c.html#a75739596484dc0db901d1289d231e7f7">scan_next</a>, NULL, NULL);
<a name="l00463"></a>00463 }
<a name="l00464"></a>00464 
<a name="l00465"></a><a class="code" href="playlist-new_8c.html#a39e53418d0d6d6dce2971b9dedef728b">00465</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a39e53418d0d6d6dce2971b9dedef728b">scan_reset</a> (<span class="keywordtype">void</span>)
<a name="l00466"></a>00466 {
<a name="l00467"></a>00467     <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scan_reset\n&quot;</span>);
<a name="l00468"></a>00468 
<a name="l00469"></a>00469     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00470"></a>00470     {
<a name="l00471"></a>00471         assert (! <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i]); <span class="comment">/* scan in progress == very, very bad */</span>
<a name="l00472"></a>00472         <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[i] = -1;
<a name="l00473"></a>00473     }
<a name="l00474"></a>00474 
<a name="l00475"></a>00475     <a class="code" href="playlist-new_8c.html#a3d02b71b46f62c7116f737fb9ed88b32">updated_ago</a> = 0;
<a name="l00476"></a>00476     <a class="code" href="playlist-new_8c.html#a088f0baf108d439bcc815d852b9c7b33">scan_continue</a> ();
<a name="l00477"></a>00477 }
<a name="l00478"></a>00478 
<a name="l00479"></a><a class="code" href="playlist-new_8c.html#a3473fd2e4a96a8e1d567ae7e92d7aec8">00479</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a3473fd2e4a96a8e1d567ae7e92d7aec8">scan_stop</a> (<span class="keywordtype">void</span>)
<a name="l00480"></a>00480 {
<a name="l00481"></a>00481     <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scan_stop\n&quot;</span>);
<a name="l00482"></a>00482     g_mutex_lock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00483"></a>00483 
<a name="l00484"></a>00484     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a> != 0)
<a name="l00485"></a>00485     {
<a name="l00486"></a>00486         g_source_remove (<a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a>);
<a name="l00487"></a>00487         <a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a> = 0;
<a name="l00488"></a>00488     }
<a name="l00489"></a>00489 
<a name="l00490"></a>00490     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00491"></a>00491     {
<a name="l00492"></a>00492         <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i])
<a name="l00493"></a>00493             <span class="keywordflow">continue</span>;
<a name="l00494"></a>00494 
<a name="l00495"></a>00495         <span class="keywordflow">while</span> (<a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>[i])
<a name="l00496"></a>00496         {
<a name="l00497"></a>00497             <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;wait for stop (#%d)\n&quot;</span>, i);
<a name="l00498"></a>00498             g_cond_wait (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i], <a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00499"></a>00499         }
<a name="l00500"></a>00500     }
<a name="l00501"></a>00501 
<a name="l00502"></a>00502     <a class="code" href="playlist-new_8c.html#ab15ce1a0b7c36cbaf4bf601d32a5b256">scan_receive</a> ();
<a name="l00503"></a>00503     g_mutex_unlock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00504"></a>00504 }
<a name="l00505"></a>00505 
<a name="l00506"></a><a class="code" href="playlist-new_8c.html#a3b244552b44a9efb864929586515e565">00506</a> <span class="keyword">static</span> <span class="keywordtype">void</span> * <a class="code" href="playlist-new_8c.html#a3b244552b44a9efb864929586515e565">scanner</a> (<span class="keywordtype">void</span> * <a class="code" href="misc-api_8h.html#a2a40119722f785a93d720b769541a543">data</a>)
<a name="l00507"></a>00507 {
<a name="l00508"></a>00508     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = GPOINTER_TO_INT (data);
<a name="l00509"></a>00509 
<a name="l00510"></a>00510     g_mutex_lock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00511"></a>00511     g_cond_signal (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i]);
<a name="l00512"></a>00512 
<a name="l00513"></a>00513     <span class="keywordflow">while</span> (1)
<a name="l00514"></a>00514     {
<a name="l00515"></a>00515         <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scanner (#%d): wait\n&quot;</span>, i);
<a name="l00516"></a>00516         g_cond_wait (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i], <a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00517"></a>00517 
<a name="l00518"></a>00518         <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a774be9656da41194a0e3457c3b4be511">scan_quit</a>)
<a name="l00519"></a>00519             <span class="keywordflow">break</span>;
<a name="l00520"></a>00520 
<a name="l00521"></a>00521         <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i])
<a name="l00522"></a>00522         {
<a name="l00523"></a>00523             <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scanner (#%d): idle\n&quot;</span>, i);
<a name="l00524"></a>00524             <span class="keywordflow">continue</span>;
<a name="l00525"></a>00525         }
<a name="l00526"></a>00526 
<a name="l00527"></a>00527         <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scanner (#%d): scan %s\n&quot;</span>, i, <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i]);
<a name="l00528"></a>00528         scan_tuples[i] = <a class="code" href="probe_8c.html#a3c90d498d5e9bbbc70b99210f22faefa">file_read_tuple</a> (<a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i], <a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>[i]);
<a name="l00529"></a>00529         <a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>[i] = NULL;
<a name="l00530"></a>00530         g_cond_signal (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i]);
<a name="l00531"></a>00531         <a class="code" href="playlist-new_8c.html#a088f0baf108d439bcc815d852b9c7b33">scan_continue</a> ();
<a name="l00532"></a>00532     }
<a name="l00533"></a>00533 
<a name="l00534"></a>00534     <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;scanner (#%d): exit\n&quot;</span>, i);
<a name="l00535"></a>00535     g_mutex_unlock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00536"></a>00536     <span class="keywordflow">return</span> NULL;
<a name="l00537"></a>00537 }
<a name="l00538"></a>00538 
<a name="l00539"></a>00539 <span class="comment">/* As soon as we know the caller is looking for metadata, we start the threaded</span>
<a name="l00540"></a>00540 <span class="comment"> * scanner.  Though it may be faster in the short run simply to scan the entry</span>
<a name="l00541"></a>00541 <span class="comment"> * we are concerned with in the main thread, this is better in the long run</span>
<a name="l00542"></a>00542 <span class="comment"> * because the scanner can work on the following entries while the caller is</span>
<a name="l00543"></a>00543 <span class="comment"> * processing this one. */</span>
<a name="l00544"></a><a class="code" href="playlist-new_8c.html#a2df5de3a0358bf77c315cfc2922b0f23">00544</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a2df5de3a0358bf77c315cfc2922b0f23">scan_threaded</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a>)
<a name="l00545"></a>00545 {
<a name="l00546"></a>00546     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i;
<a name="l00547"></a>00547 
<a name="l00548"></a>00548     <span class="keywordflow">if</span> (playlist != active_playlist)
<a name="l00549"></a>00549         <span class="keywordflow">return</span> FALSE;
<a name="l00550"></a>00550 
<a name="l00551"></a>00551     <a class="code" href="playlist-new_8c.html#a75739596484dc0db901d1289d231e7f7">scan_next</a> (NULL);
<a name="l00552"></a>00552 
<a name="l00553"></a>00553     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>)
<a name="l00554"></a>00554         <span class="keywordflow">return</span> TRUE;
<a name="l00555"></a>00555 
<a name="l00556"></a>00556     <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00557"></a>00557     {
<a name="l00558"></a>00558         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> == <a class="code" href="playlist-new_8c.html#a5d96a0d6b378c91bbaca281ad6d202fd">scan_positions</a>[i])
<a name="l00559"></a>00559             <span class="keywordflow">goto</span> FOUND;
<a name="l00560"></a>00560     }
<a name="l00561"></a>00561 
<a name="l00562"></a>00562     <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;manual scan of %d\n&quot;</span>, entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>);
<a name="l00563"></a>00563     <span class="keywordflow">return</span> FALSE;
<a name="l00564"></a>00564 
<a name="l00565"></a>00565 FOUND:
<a name="l00566"></a>00566     <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;threaded scan (#%d) of %d\n&quot;</span>, i, entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>);
<a name="l00567"></a>00567     g_mutex_lock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00568"></a>00568     <a class="code" href="playlist-new_8c.html#ab15ce1a0b7c36cbaf4bf601d32a5b256">scan_receive</a> ();
<a name="l00569"></a>00569 
<a name="l00570"></a>00570     <span class="keywordflow">while</span> (<a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>[i])
<a name="l00571"></a>00571     {
<a name="l00572"></a>00572         <a class="code" href="playlist-new_8c.html#ae8345fd3ce4f7e3478c9311354f61f3f">SCAN_DEBUG</a> (<span class="stringliteral">&quot;wait (#%d) for %d\n&quot;</span>, i, entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>);
<a name="l00573"></a>00573         g_cond_wait (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i], <a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00574"></a>00574         <a class="code" href="playlist-new_8c.html#ab15ce1a0b7c36cbaf4bf601d32a5b256">scan_receive</a> ();
<a name="l00575"></a>00575     }
<a name="l00576"></a>00576 
<a name="l00577"></a>00577     g_mutex_unlock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00578"></a>00578     <span class="keywordflow">return</span> TRUE;
<a name="l00579"></a>00579 }
<a name="l00580"></a>00580 
<a name="l00581"></a><a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">00581</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">check_scanned</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a>)
<a name="l00582"></a>00582 {
<a name="l00583"></a>00583     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>)
<a name="l00584"></a>00584         <span class="keywordflow">return</span>;
<a name="l00585"></a>00585     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a2df5de3a0358bf77c315cfc2922b0f23">scan_threaded</a> (playlist, entry))
<a name="l00586"></a>00586         <span class="keywordflow">return</span>;
<a name="l00587"></a>00587 
<a name="l00588"></a>00588     <a class="code" href="playlist-new_8c.html#addafbb017bae32d49d15531975f7b5b5">entry_check_has_decoder</a> (playlist, entry);
<a name="l00589"></a>00589     <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a>)
<a name="l00590"></a>00590         <span class="keywordflow">return</span>;
<a name="l00591"></a>00591 
<a name="l00592"></a>00592     <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (playlist, entry, <a class="code" href="probe_8c.html#a3c90d498d5e9bbbc70b99210f22faefa">file_read_tuple</a> (entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>,
<a name="l00593"></a>00593      entry-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a>));
<a name="l00594"></a>00594     <span class="keywordflow">if</span> (! entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>)
<a name="l00595"></a>00595         <a class="code" href="playlist-new_8c.html#af9cbb817baea1b6ea3bea9fedffafd6d">entry_set_failed</a> (playlist, entry);
<a name="l00596"></a>00596 
<a name="l00597"></a>00597     <a class="code" href="playlist-new_8c.html#a0a10236264f6e8b187b9977de3e57286">queue_update</a> (<a class="code" href="playlist_8h.html#abc5c98fcc1211af2b80116dd6e0a035da7baed2f89f9043bab7b82c4eefe0bd7a">PLAYLIST_UPDATE_METADATA</a>);
<a name="l00598"></a>00598 }
<a name="l00599"></a>00599 
<a name="l00600"></a><a class="code" href="playlist-new_8c.html#a4286d5c380a4265df0c73acc751132ef">00600</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a4286d5c380a4265df0c73acc751132ef">check_selected_scanned</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>)
<a name="l00601"></a>00601 {
<a name="l00602"></a>00602     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00603"></a>00603     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> &lt; entries; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>++)
<a name="l00604"></a>00604     {
<a name="l00605"></a>00605         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>);
<a name="l00606"></a>00606         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l00607"></a>00607             <a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">check_scanned</a> (playlist, entry);
<a name="l00608"></a>00608     }
<a name="l00609"></a>00609 }
<a name="l00610"></a>00610 
<a name="l00611"></a><a class="code" href="playlist-new_8c.html#aa110eb72a12caa0c60dc62ebb553b80e">00611</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#aa110eb72a12caa0c60dc62ebb553b80e">check_all_scanned</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>)
<a name="l00612"></a>00612 {
<a name="l00613"></a>00613     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00614"></a>00614     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> &lt; entries; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>++)
<a name="l00615"></a>00615         <a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">check_scanned</a> (playlist, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>));
<a name="l00616"></a>00616 }
<a name="l00617"></a>00617 
<a name="l00618"></a><a class="code" href="playlist-new_8c.html#aaa9114945a129ea886b69a84fe01d696">00618</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#aaa9114945a129ea886b69a84fe01d696">playlist_init</a> (<span class="keywordtype">void</span>)
<a name="l00619"></a>00619 {
<a name="l00620"></a>00620     <span class="keyword">struct </span><a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="playlist-api_8h.html#a215ca45f357a38d7cbbac627bf81b9de">playlist</a>;
<a name="l00621"></a>00621 
<a name="l00622"></a>00622     srandom (time (NULL));
<a name="l00623"></a>00623 
<a name="l00624"></a>00624     playlists = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a> ();
<a name="l00625"></a>00625     playlist = <a class="code" href="playlist-new_8c.html#a89e952132fe0a4cede0de22c0aced287">playlist_new</a> ();
<a name="l00626"></a>00626     <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a> (playlists, playlist);
<a name="l00627"></a>00627     playlist-&gt;<a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">number</a> = 0;
<a name="l00628"></a>00628     active_playlist = <a class="code" href="playlist-api_8h.html#a215ca45f357a38d7cbbac627bf81b9de">playlist</a>;
<a name="l00629"></a>00629     playing_playlist = NULL;
<a name="l00630"></a>00630 
<a name="l00631"></a>00631     <a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a> = 0;
<a name="l00632"></a>00632     <a class="code" href="playlist-new_8c.html#a327e782ad2e8093024de9d68ea9a9b73">update_level</a> = 0;
<a name="l00633"></a>00633 
<a name="l00634"></a>00634     <a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a> = g_mutex_new ();
<a name="l00635"></a>00635     memset (<a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>, 0, <span class="keyword">sizeof</span> <a class="code" href="playlist-new_8c.html#a9c4fd4919070f08ee3afc917291e4d98">scan_filenames</a>);
<a name="l00636"></a>00636     memset (<a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>, 0, <span class="keyword">sizeof</span> <a class="code" href="playlist-new_8c.html#a86a4290d8e0f25d5ec9643bd8fc381f8">scan_decoders</a>);
<a name="l00637"></a>00637     memset (scan_tuples, 0, <span class="keyword">sizeof</span> scan_tuples);
<a name="l00638"></a>00638     <a class="code" href="playlist-new_8c.html#aef65edb820a8bc795eebfd34002d1591">scan_source</a> = 0;
<a name="l00639"></a>00639     <a class="code" href="playlist-new_8c.html#a774be9656da41194a0e3457c3b4be511">scan_quit</a> = FALSE;
<a name="l00640"></a>00640 
<a name="l00641"></a>00641     g_mutex_lock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00642"></a>00642 
<a name="l00643"></a>00643     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00644"></a>00644     {
<a name="l00645"></a>00645         <a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i] = g_cond_new ();
<a name="l00646"></a>00646         <a class="code" href="playlist-new_8c.html#a46b34cea34c84c91444105620d048882">scan_threads</a>[i] = g_thread_create (<a class="code" href="playlist-new_8c.html#a3b244552b44a9efb864929586515e565">scanner</a>, GINT_TO_POINTER (i), TRUE,
<a name="l00647"></a>00647          NULL);
<a name="l00648"></a>00648         g_cond_wait (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i], <a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00649"></a>00649     }
<a name="l00650"></a>00650 
<a name="l00651"></a>00651     g_mutex_unlock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00652"></a>00652 
<a name="l00653"></a>00653     <a class="code" href="playlist-new_8c.html#a39e53418d0d6d6dce2971b9dedef728b">scan_reset</a> ();
<a name="l00654"></a>00654 }
<a name="l00655"></a>00655 
<a name="l00656"></a><a class="code" href="playlist-new_8c.html#aaafaea217a4607ef2c71f8eebc6b052d">00656</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#aaafaea217a4607ef2c71f8eebc6b052d">playlist_end</a>(<span class="keywordtype">void</span>)
<a name="l00657"></a>00657 {
<a name="l00658"></a>00658     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00659"></a>00659 
<a name="l00660"></a>00660     <a class="code" href="playlist-new_8c.html#a3473fd2e4a96a8e1d567ae7e92d7aec8">scan_stop</a> ();
<a name="l00661"></a>00661     <a class="code" href="playlist-new_8c.html#a774be9656da41194a0e3457c3b4be511">scan_quit</a> = TRUE;
<a name="l00662"></a>00662 
<a name="l00663"></a>00663     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; <a class="code" href="playlist-new_8c.html#a478ea37a85a6bfc53cdd214c6fe3f72e">SCAN_THREADS</a>; i ++)
<a name="l00664"></a>00664     {
<a name="l00665"></a>00665         g_mutex_lock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00666"></a>00666         g_cond_signal (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i]);
<a name="l00667"></a>00667         g_mutex_unlock (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00668"></a>00668         g_thread_join (<a class="code" href="playlist-new_8c.html#a46b34cea34c84c91444105620d048882">scan_threads</a>[i]);
<a name="l00669"></a>00669         g_cond_free (<a class="code" href="playlist-new_8c.html#a521a052d8fd2a9030077e553fbbbb321">scan_conds</a>[i]);
<a name="l00670"></a>00670     }
<a name="l00671"></a>00671 
<a name="l00672"></a>00672     g_mutex_free (<a class="code" href="playlist-new_8c.html#a824a83d709af27b86fe3ac652dcb0f66">scan_mutex</a>);
<a name="l00673"></a>00673 
<a name="l00674"></a>00674     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a> != 0)
<a name="l00675"></a>00675         g_source_remove(<a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a>);
<a name="l00676"></a>00676 
<a name="l00677"></a>00677     <span class="keywordflow">for</span> (count = 0; count &lt; <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists); count++)
<a name="l00678"></a>00678         <a class="code" href="playlist-new_8c.html#a0197d23bf9e5ceaac2ae19532c94ee6d">playlist_free</a>(<a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlists, count));
<a name="l00679"></a>00679 
<a name="l00680"></a>00680     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(playlists);
<a name="l00681"></a>00681 }
<a name="l00682"></a>00682 
<a name="l00683"></a><a class="code" href="playlist-new_8c.html#afe6f4255fa895b81dfc74ed09440a954">00683</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#afe6f4255fa895b81dfc74ed09440a954">playlist_count</a>(<span class="keywordtype">void</span>)
<a name="l00684"></a>00684 {
<a name="l00685"></a>00685     <span class="keywordflow">return</span> <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists);
<a name="l00686"></a>00686 }
<a name="l00687"></a>00687 
<a name="l00688"></a><a class="code" href="playlist-new_8c.html#aafa0be01562188eeaa58139dba11a48f">00688</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#aafa0be01562188eeaa58139dba11a48f">playlist_insert</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>)
<a name="l00689"></a>00689 {
<a name="l00690"></a>00690     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00691"></a>00691 
<a name="l00692"></a>00692     <span class="keywordflow">if</span> (at &lt; 0 || at &gt; <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists))
<a name="l00693"></a>00693         at = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists);
<a name="l00694"></a>00694 
<a name="l00695"></a>00695     <span class="keywordflow">if</span> (at == <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists))
<a name="l00696"></a>00696         <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(playlists, <a class="code" href="playlist-new_8c.html#a89e952132fe0a4cede0de22c0aced287">playlist_new</a>());
<a name="l00697"></a>00697     <span class="keywordflow">else</span>
<a name="l00698"></a>00698         <a class="code" href="index_8c.html#ac327768fa9c3e9f8172f81f5064fe46d">index_insert</a>(playlists, at, <a class="code" href="playlist-new_8c.html#a89e952132fe0a4cede0de22c0aced287">playlist_new</a>());
<a name="l00699"></a>00699 
<a name="l00700"></a>00700     <a class="code" href="playlist-new_8c.html#ad7db14a4cba25f23c9ad7107ae4ecab6">number_playlists</a>(at, <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists) - at);
<a name="l00701"></a>00701 
<a name="l00702"></a>00702     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00703"></a>00703     <a class="code" href="hook_8c.html#a2db1ccd2efbd82b151393e3aedd42550">hook_call</a> (<span class="stringliteral">&quot;playlist insert&quot;</span>, GINT_TO_POINTER (at));
<a name="l00704"></a>00704 }
<a name="l00705"></a>00705 
<a name="l00706"></a><a class="code" href="playlist-new_8c.html#a2f463c1fbcc321f7e2536691e015f36b">00706</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a2f463c1fbcc321f7e2536691e015f36b">playlist_reorder</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="audio_8c.html#a62b017d3766f53106a7732cf592551cf">from</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="audio_8c.html#ad8e0aa430ac4f3c92bb182ef435bf245">to</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>)
<a name="l00707"></a>00707 {
<a name="l00708"></a>00708     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> * displaced;
<a name="l00709"></a>00709 
<a name="l00710"></a>00710     g_return_if_fail (from &gt;= 0 &amp;&amp; from + count &lt;= <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlists));
<a name="l00711"></a>00711     g_return_if_fail (to &gt;= 0 &amp;&amp; to + count &lt;= <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlists));
<a name="l00712"></a>00712     g_return_if_fail (count &gt;= 0);
<a name="l00713"></a>00713 
<a name="l00714"></a>00714     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00715"></a>00715 
<a name="l00716"></a>00716     displaced = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a> ();
<a name="l00717"></a>00717 
<a name="l00718"></a>00718     <span class="keywordflow">if</span> (to &lt; from)
<a name="l00719"></a>00719         <a class="code" href="index_8c.html#adea784eb6191d38c5856e781e882b9e3">index_copy_append</a> (playlists, to, displaced, from - to);
<a name="l00720"></a>00720     <span class="keywordflow">else</span>
<a name="l00721"></a>00721         <a class="code" href="index_8c.html#adea784eb6191d38c5856e781e882b9e3">index_copy_append</a> (playlists, from + count, displaced, to - from);
<a name="l00722"></a>00722 
<a name="l00723"></a>00723     <a class="code" href="index_8c.html#acc0473feb92360238c2e43652d7787a7">index_move</a> (playlists, from, to, count);
<a name="l00724"></a>00724 
<a name="l00725"></a>00725     <span class="keywordflow">if</span> (to &lt; from)
<a name="l00726"></a>00726     {
<a name="l00727"></a>00727         <a class="code" href="index_8c.html#a2eee306cf6aac8663a7be0f58a9ca890">index_copy_set</a> (displaced, 0, playlists, to + count, from - to);
<a name="l00728"></a>00728         <a class="code" href="playlist-new_8c.html#ad7db14a4cba25f23c9ad7107ae4ecab6">number_playlists</a> (to, from + count - to);
<a name="l00729"></a>00729     }
<a name="l00730"></a>00730     <span class="keywordflow">else</span>
<a name="l00731"></a>00731     {
<a name="l00732"></a>00732         <a class="code" href="index_8c.html#a2eee306cf6aac8663a7be0f58a9ca890">index_copy_set</a> (displaced, 0, playlists, from, to - from);
<a name="l00733"></a>00733         <a class="code" href="playlist-new_8c.html#ad7db14a4cba25f23c9ad7107ae4ecab6">number_playlists</a> (from, to + count - from);
<a name="l00734"></a>00734     }
<a name="l00735"></a>00735 
<a name="l00736"></a>00736     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a> (displaced);
<a name="l00737"></a>00737 
<a name="l00738"></a>00738     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00739"></a>00739 }
<a name="l00740"></a>00740 
<a name="l00741"></a><a class="code" href="playlist-new_8c.html#a5e458359390c0fad124212fe3c081cb1">00741</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a5e458359390c0fad124212fe3c081cb1">playlist_delete</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00742"></a>00742 {
<a name="l00743"></a>00743     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00744"></a>00744 
<a name="l00745"></a>00745     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00746"></a>00746 
<a name="l00747"></a>00747     <a class="code" href="hook_8c.html#a2db1ccd2efbd82b151393e3aedd42550">hook_call</a> (<span class="stringliteral">&quot;playlist delete&quot;</span>, GINT_TO_POINTER (playlist_num));
<a name="l00748"></a>00748 
<a name="l00749"></a>00749     <span class="keywordflow">if</span> (<a class="code" href="structplaylist.html">playlist</a> == playing_playlist)
<a name="l00750"></a>00750     {
<a name="l00751"></a>00751         <span class="keywordflow">if</span> (<a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l00752"></a>00752             <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a> ();
<a name="l00753"></a>00753 
<a name="l00754"></a>00754         playing_playlist = NULL;
<a name="l00755"></a>00755     }
<a name="l00756"></a>00756 
<a name="l00757"></a>00757     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00758"></a>00758 
<a name="l00759"></a>00759     <a class="code" href="playlist-new_8c.html#a0197d23bf9e5ceaac2ae19532c94ee6d">playlist_free</a>(<a class="code" href="structplaylist.html">playlist</a>);
<a name="l00760"></a>00760     <a class="code" href="index_8c.html#af46c7490bfeab599246ca3d9412df136">index_delete</a>(playlists, playlist_num, 1);
<a name="l00761"></a>00761     <a class="code" href="playlist-new_8c.html#ad7db14a4cba25f23c9ad7107ae4ecab6">number_playlists</a>(playlist_num, <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists) - playlist_num);
<a name="l00762"></a>00762 
<a name="l00763"></a>00763     <span class="keywordflow">if</span> (<a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists) == 0)
<a name="l00764"></a>00764         <a class="code" href="playlist-new_8c.html#aafa0be01562188eeaa58139dba11a48f">playlist_insert</a>(0);
<a name="l00765"></a>00765 
<a name="l00766"></a>00766     <span class="keywordflow">if</span> (<a class="code" href="structplaylist.html">playlist</a> == active_playlist)
<a name="l00767"></a>00767         active_playlist = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlists, MIN (playlist_num, <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>
<a name="l00768"></a>00768          (playlists) - 1));
<a name="l00769"></a>00769 
<a name="l00770"></a>00770     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00771"></a>00771 }
<a name="l00772"></a>00772 
<a name="l00773"></a><a class="code" href="playlist-new_8c.html#a9d2f31b83e920e62131dfced3a3e9ce0">00773</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a9d2f31b83e920e62131dfced3a3e9ce0">playlist_set_filename</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <span class="keyword">const</span> gchar * <a class="code" href="misc-api_8h.html#a820d8643bcfa9e2641dd6377f804de20">filename</a>)
<a name="l00774"></a>00774 {
<a name="l00775"></a>00775     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00776"></a>00776 
<a name="l00777"></a>00777     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00778"></a>00778     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00779"></a>00779 
<a name="l00780"></a>00780     g_free(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">filename</a>);
<a name="l00781"></a>00781     <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">filename</a> = g_strdup(filename);
<a name="l00782"></a>00782 
<a name="l00783"></a>00783     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00784"></a>00784 }
<a name="l00785"></a>00785 
<a name="l00786"></a><a class="code" href="playlist-new_8c.html#acaf8e251bbfb3d31823e457b78c14924">00786</a> <span class="keyword">const</span> gchar *<a class="code" href="playlist-new_8c.html#acaf8e251bbfb3d31823e457b78c14924">playlist_get_filename</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00787"></a>00787 {
<a name="l00788"></a>00788     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00789"></a>00789 
<a name="l00790"></a>00790     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (NULL);
<a name="l00791"></a>00791 
<a name="l00792"></a>00792     <span class="keywordflow">return</span> <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeb54d8feecd51625f27040a1e52d04d8">filename</a>;
<a name="l00793"></a>00793 }
<a name="l00794"></a>00794 
<a name="l00795"></a><a class="code" href="playlist-new_8c.html#a482306c73c14325dde96a440705b7f4a">00795</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a482306c73c14325dde96a440705b7f4a">playlist_set_title</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <span class="keyword">const</span> gchar * title)
<a name="l00796"></a>00796 {
<a name="l00797"></a>00797     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00798"></a>00798 
<a name="l00799"></a>00799     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00800"></a>00800     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00801"></a>00801 
<a name="l00802"></a>00802     g_free(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">title</a>);
<a name="l00803"></a>00803     <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">title</a> = g_strdup(title);
<a name="l00804"></a>00804 
<a name="l00805"></a>00805     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00806"></a>00806 }
<a name="l00807"></a>00807 
<a name="l00808"></a><a class="code" href="playlist-new_8c.html#ad4a7ded51091d0f3844022b2c4f8b764">00808</a> <span class="keyword">const</span> gchar *<a class="code" href="playlist-new_8c.html#ad4a7ded51091d0f3844022b2c4f8b764">playlist_get_title</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00809"></a>00809 {
<a name="l00810"></a>00810     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00811"></a>00811 
<a name="l00812"></a>00812     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (NULL);
<a name="l00813"></a>00813 
<a name="l00814"></a>00814     <span class="keywordflow">return</span> <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a1ce61cdee483439d270add35b1c69089">title</a>;
<a name="l00815"></a>00815 }
<a name="l00816"></a>00816 
<a name="l00817"></a><a class="code" href="playlist-new_8c.html#af34d9eaa4d82c7878e86c8db6e69c7d7">00817</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#af34d9eaa4d82c7878e86c8db6e69c7d7">playlist_set_active</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00818"></a>00818 {
<a name="l00819"></a>00819     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00820"></a>00820 
<a name="l00821"></a>00821     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00822"></a>00822     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00823"></a>00823 
<a name="l00824"></a>00824     active_playlist = <a class="code" href="playlist-api_8h.html#a215ca45f357a38d7cbbac627bf81b9de">playlist</a>;
<a name="l00825"></a>00825 
<a name="l00826"></a>00826     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00827"></a>00827 }
<a name="l00828"></a>00828 
<a name="l00829"></a><a class="code" href="playlist-new_8c.html#a32abcfcf28e68da7c91b21db688e85f3">00829</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a32abcfcf28e68da7c91b21db688e85f3">playlist_get_active</a>(<span class="keywordtype">void</span>)
<a name="l00830"></a>00830 {
<a name="l00831"></a>00831     <span class="keywordflow">return</span> (active_playlist == NULL) ? -1 : active_playlist-&gt;<a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">number</a>;
<a name="l00832"></a>00832 }
<a name="l00833"></a>00833 
<a name="l00834"></a><a class="code" href="playlist-new_8c.html#a899f846c0ea0d1ec3a44c891ddb5d1cc">00834</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a899f846c0ea0d1ec3a44c891ddb5d1cc">playlist_set_playing</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00835"></a>00835 {
<a name="l00836"></a>00836     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00837"></a>00837 
<a name="l00838"></a>00838     <span class="keywordflow">if</span> (playlist_num == -1)
<a name="l00839"></a>00839         <a class="code" href="structplaylist.html">playlist</a> = NULL;
<a name="l00840"></a>00840     <span class="keywordflow">else</span>
<a name="l00841"></a>00841         <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00842"></a>00842 
<a name="l00843"></a>00843     <span class="keywordflow">if</span> (playing_playlist != NULL &amp;&amp; <a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l00844"></a>00844         <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a>();
<a name="l00845"></a>00845 
<a name="l00846"></a>00846     playing_playlist = <a class="code" href="playlist-api_8h.html#a215ca45f357a38d7cbbac627bf81b9de">playlist</a>;
<a name="l00847"></a>00847 }
<a name="l00848"></a>00848 
<a name="l00849"></a><a class="code" href="playlist-new_8c.html#a9148257b8f1ae313fc9176aea46221ee">00849</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a9148257b8f1ae313fc9176aea46221ee">playlist_get_playing</a>(<span class="keywordtype">void</span>)
<a name="l00850"></a>00850 {
<a name="l00851"></a>00851     <span class="keywordflow">return</span> (playing_playlist == NULL) ? -1 : playing_playlist-&gt;<a class="code" href="structplaylist.html#a0d2d35652aaf4261a29ce6981684d6fc">number</a>;
<a name="l00852"></a>00852 }
<a name="l00853"></a>00853 
<a name="l00854"></a>00854 <span class="comment">/* If we are already at the song or it is already at the top of the shuffle</span>
<a name="l00855"></a>00855 <span class="comment"> * list, we let it be.  Otherwise, we move it to the top. */</span>
<a name="l00856"></a><a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">00856</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <span class="keyword">struct</span> <a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a>)
<a name="l00857"></a>00857 {
<a name="l00858"></a>00858     <span class="keywordflow">if</span> (entry == playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>)
<a name="l00859"></a>00859         <span class="keywordflow">return</span>;
<a name="l00860"></a>00860 
<a name="l00861"></a>00861     playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> = <a class="code" href="playlist-api_8h.html#abaa108414cc2c74407885fb19e375eb7">entry</a>;
<a name="l00862"></a>00862 
<a name="l00863"></a>00863     <span class="keywordflow">if</span> (entry == NULL)
<a name="l00864"></a>00864         <span class="keywordflow">return</span>;
<a name="l00865"></a>00865 
<a name="l00866"></a>00866     <span class="keywordflow">if</span> (! entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> || entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> != playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a>)
<a name="l00867"></a>00867     {
<a name="l00868"></a>00868         playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a> ++;
<a name="l00869"></a>00869         entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> = playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a>;
<a name="l00870"></a>00870     }
<a name="l00871"></a>00871 }
<a name="l00872"></a>00872 
<a name="l00873"></a><a class="code" href="playlist-new_8c.html#af64b7c6ea43b1b56f85c348ddaf39bae">00873</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#af64b7c6ea43b1b56f85c348ddaf39bae">playlist_entry_count</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l00874"></a>00874 {
<a name="l00875"></a>00875     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00876"></a>00876 
<a name="l00877"></a>00877     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (0);
<a name="l00878"></a>00878 
<a name="l00879"></a>00879     <span class="keywordflow">return</span> <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00880"></a>00880 }
<a name="l00881"></a>00881 
<a name="l00882"></a><a class="code" href="playlist-new_8c.html#ada369ef28d553eb3c1d82213148228c9">00882</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ada369ef28d553eb3c1d82213148228c9">make_entries</a> (gchar * <a class="code" href="misc-api_8h.html#a820d8643bcfa9e2641dd6377f804de20">filename</a>, InputPlugin * <a class="code" href="misc-api_8h.html#a223c76d43f12031a46d1f35c744332fa">decoder</a>, <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> *
<a name="l00883"></a>00883  tuple, <span class="keyword">struct</span> <a class="code" href="structindex.html">index</a> * <a class="code" href="misc-api_8h.html#a5b3afcdfb4bae9b4dd1b1ba8f2e6e638">list</a>)
<a name="l00884"></a>00884 {
<a name="l00885"></a>00885     <a class="code" href="audstrings_8c.html#a05b116a9463f3608b1db16c680908859">uri_check_utf8</a> (&amp; filename, TRUE);
<a name="l00886"></a>00886 
<a name="l00887"></a>00887     <span class="keywordflow">if</span> (tuple == NULL &amp;&amp; decoder == NULL)
<a name="l00888"></a>00888         decoder = <a class="code" href="misc-api_8h.html#a6769ae60103bd67203a66c2eceeccffc">file_find_decoder</a> (filename, TRUE);
<a name="l00889"></a>00889 
<a name="l00890"></a>00890     <span class="keywordflow">if</span> (tuple == NULL &amp;&amp; decoder != NULL &amp;&amp; decoder-&gt;have_subtune &amp;&amp; strchr
<a name="l00891"></a>00891      (filename, <span class="charliteral">&#39;?&#39;</span>) == NULL)
<a name="l00892"></a>00892         tuple = <a class="code" href="probe_8c.html#a3c90d498d5e9bbbc70b99210f22faefa">file_read_tuple</a> (filename, decoder);
<a name="l00893"></a>00893 
<a name="l00894"></a>00894     <span class="keywordflow">if</span> (tuple != NULL &amp;&amp; tuple-&gt;<a class="code" href="structTuple.html#ab93bcc773a02dc12d09f14999cce1374" title="Number of subtunes, if any.">nsubtunes</a> &gt; 0)
<a name="l00895"></a>00895     {
<a name="l00896"></a>00896         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> subtune;
<a name="l00897"></a>00897 
<a name="l00898"></a>00898         <span class="keywordflow">for</span> (subtune = 0; subtune &lt; tuple-&gt;<a class="code" href="structTuple.html#ab93bcc773a02dc12d09f14999cce1374" title="Number of subtunes, if any.">nsubtunes</a>; subtune++)
<a name="l00899"></a>00899         {
<a name="l00900"></a>00900             gchar *name = g_strdup_printf(<span class="stringliteral">&quot;%s?%d&quot;</span>, filename, (tuple-&gt;<a class="code" href="structTuple.html#a996d8f4c415d316cd92d9fbfdc3f7be0" title="Array of gint containing subtune index numbers.">subtunes</a> == NULL) ? 1 + subtune : tuple-&gt;<a class="code" href="structTuple.html#a996d8f4c415d316cd92d9fbfdc3f7be0" title="Array of gint containing subtune index numbers.">subtunes</a>[subtune]);
<a name="l00901"></a>00901             <a class="code" href="playlist-new_8c.html#ada369ef28d553eb3c1d82213148228c9">make_entries</a>(name, decoder, NULL, list);
<a name="l00902"></a>00902         }
<a name="l00903"></a>00903 
<a name="l00904"></a>00904         g_free(filename);
<a name="l00905"></a>00905         <a class="code" href="tuple_8h.html#a975e29105dbaa18ad44c05a2a43a6d8d">tuple_free</a>(tuple);
<a name="l00906"></a>00906     }
<a name="l00907"></a>00907     <span class="keywordflow">else</span>
<a name="l00908"></a>00908         <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(list, <a class="code" href="playlist-new_8c.html#a6c7e5f920b20073d72ea9edc7cde1fe7">entry_new</a>(filename, decoder, tuple));
<a name="l00909"></a>00909 }
<a name="l00910"></a>00910 
<a name="l00911"></a><a class="code" href="playlist-new_8c.html#accc89ffeec22b2ba2d533dfb61303ab3">00911</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#accc89ffeec22b2ba2d533dfb61303ab3">playlist_entry_insert</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, gchar * <a class="code" href="misc-api_8h.html#a820d8643bcfa9e2641dd6377f804de20">filename</a>, <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * tuple)
<a name="l00912"></a>00912 {
<a name="l00913"></a>00913     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *<a class="code" href="playlist-api_8h.html#a783ee3d36e78898c539e7cc7c266075e">filenames</a> = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l00914"></a>00914     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *tuples = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l00915"></a>00915 
<a name="l00916"></a>00916     <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(filenames, filename);
<a name="l00917"></a>00917     <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(tuples, tuple);
<a name="l00918"></a>00918 
<a name="l00919"></a>00919     <a class="code" href="playlist-api_8h.html#a5d9a18d7268bc797fb1afd5c142e74d8">playlist_entry_insert_batch</a>(playlist_num, at, filenames, tuples);
<a name="l00920"></a>00920 }
<a name="l00921"></a>00921 
<a name="l00922"></a><a class="code" href="playlist-new_8c.html#a3f661da0b223f2085961d9990e8f8c87">00922</a> <span class="keywordtype">void</span> <a class="code" href="playlist-api_8h.html#a5d9a18d7268bc797fb1afd5c142e74d8">playlist_entry_insert_batch</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, <span class="keyword">struct</span> <a class="code" href="structindex.html">index</a> *<a class="code" href="playlist-api_8h.html#a783ee3d36e78898c539e7cc7c266075e">filenames</a>, <span class="keyword">struct</span> <a class="code" href="structindex.html">index</a> *tuples)
<a name="l00923"></a>00923 {
<a name="l00924"></a>00924     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00925"></a>00925     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, number, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00926"></a>00926     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *add;
<a name="l00927"></a>00927 
<a name="l00928"></a>00928     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00929"></a>00929     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00930"></a>00930 
<a name="l00931"></a>00931     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00932"></a>00932 
<a name="l00933"></a>00933     <span class="keywordflow">if</span> (at &lt; 0 || at &gt; entries)
<a name="l00934"></a>00934         at = entries;
<a name="l00935"></a>00935 
<a name="l00936"></a>00936     number = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(filenames);
<a name="l00937"></a>00937     add = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l00938"></a>00938 
<a name="l00939"></a>00939     <span class="keywordflow">for</span> (count = 0; count &lt; number; count++)
<a name="l00940"></a>00940         <a class="code" href="playlist-new_8c.html#ada369ef28d553eb3c1d82213148228c9">make_entries</a>(<a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(filenames, count), NULL, (tuples == NULL) ? NULL : <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(tuples, count), add);
<a name="l00941"></a>00941 
<a name="l00942"></a>00942     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(filenames);
<a name="l00943"></a>00943 
<a name="l00944"></a>00944     <span class="keywordflow">if</span> (tuples != NULL)
<a name="l00945"></a>00945         <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(tuples);
<a name="l00946"></a>00946 
<a name="l00947"></a>00947     number = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(add);
<a name="l00948"></a>00948 
<a name="l00949"></a>00949     <span class="keywordflow">if</span> (at == entries)
<a name="l00950"></a>00950         <a class="code" href="index_8c.html#ab0613ac09bf5cb4a5267d364c26ec9cf">index_merge_append</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, add);
<a name="l00951"></a>00951     <span class="keywordflow">else</span>
<a name="l00952"></a>00952         <a class="code" href="index_8c.html#a8f097b6e98de228f861398179cad6b36">index_merge_insert</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, at, add);
<a name="l00953"></a>00953 
<a name="l00954"></a>00954     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(add);
<a name="l00955"></a>00955 
<a name="l00956"></a>00956     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(<a class="code" href="structplaylist.html">playlist</a>, at, entries + number - at);
<a name="l00957"></a>00957 
<a name="l00958"></a>00958     <span class="keywordflow">for</span> (count = 0; count &lt; number; count++)
<a name="l00959"></a>00959     {
<a name="l00960"></a>00960         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, at + count);
<a name="l00961"></a>00961 
<a name="l00962"></a>00962         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a> += entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00963"></a>00963     }
<a name="l00964"></a>00964 
<a name="l00965"></a>00965     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l00966"></a>00966 }
<a name="l00967"></a>00967 
<a name="l00968"></a><a class="code" href="playlist-new_8c.html#a0f9dc152eb2c9f1c293e97397cfb90c5">00968</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a0f9dc152eb2c9f1c293e97397cfb90c5">playlist_entry_delete</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>)
<a name="l00969"></a>00969 {
<a name="l00970"></a>00970     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l00971"></a>00971     <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> stop = FALSE;
<a name="l00972"></a>00972     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l00973"></a>00973 
<a name="l00974"></a>00974     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l00975"></a>00975     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l00976"></a>00976 
<a name="l00977"></a>00977     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l00978"></a>00978 
<a name="l00979"></a>00979     <span class="keywordflow">if</span> (at &lt; 0 || at &gt; entries)
<a name="l00980"></a>00980         at = entries;
<a name="l00981"></a>00981     <span class="keywordflow">if</span> (number &lt; 0 || number &gt; entries - at)
<a name="l00982"></a>00982         number = entries - <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>;
<a name="l00983"></a>00983 
<a name="l00984"></a>00984     <span class="keywordflow">for</span> (count = 0; count &lt; <a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>; count++)
<a name="l00985"></a>00985     {
<a name="l00986"></a>00986         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, at + count);
<a name="l00987"></a>00987 
<a name="l00988"></a>00988         <span class="keywordflow">if</span> (entry == <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>)
<a name="l00989"></a>00989         {
<a name="l00990"></a>00990             stop = (<a class="code" href="structplaylist.html">playlist</a> == <a class="code" href="playlist-new_8c.html#a10acb61156324fa4c2d818fc655da621">playing_playlist</a>);
<a name="l00991"></a>00991             <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (<a class="code" href="structplaylist.html">playlist</a>, NULL);
<a name="l00992"></a>00992         }
<a name="l00993"></a>00993 
<a name="l00994"></a>00994         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l00995"></a>00995         {
<a name="l00996"></a>00996             <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a>--;
<a name="l00997"></a>00997             <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> -= entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l00998"></a>00998         }
<a name="l00999"></a>00999 
<a name="l01000"></a>01000         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a>)
<a name="l01001"></a>01001             <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_remove(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, entry);
<a name="l01002"></a>01002 
<a name="l01003"></a>01003         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a> -= entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l01004"></a>01004 
<a name="l01005"></a>01005         <a class="code" href="playlist-new_8c.html#ace274769168158e771e7266a3c04e5a9">entry_free</a>(entry);
<a name="l01006"></a>01006     }
<a name="l01007"></a>01007 
<a name="l01008"></a>01008     <a class="code" href="index_8c.html#af46c7490bfeab599246ca3d9412df136">index_delete</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, at, number);
<a name="l01009"></a>01009     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(<a class="code" href="structplaylist.html">playlist</a>, at, entries - number - at);
<a name="l01010"></a>01010 
<a name="l01011"></a>01011     <span class="keywordflow">if</span> (stop &amp;&amp; <a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l01012"></a>01012         <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a> ();
<a name="l01013"></a>01013 
<a name="l01014"></a>01014     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01015"></a>01015 }
<a name="l01016"></a>01016 
<a name="l01017"></a><a class="code" href="playlist-new_8c.html#a87cc5b5c9270aefb2c09712afbb8d1e2">01017</a> <span class="keyword">const</span> gchar *<a class="code" href="playlist-new_8c.html#a87cc5b5c9270aefb2c09712afbb8d1e2">playlist_entry_get_filename</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01018"></a>01018 {
<a name="l01019"></a>01019     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01020"></a>01020 
<a name="l01021"></a>01021     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (NULL);
<a name="l01022"></a>01022 
<a name="l01023"></a>01023     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>;
<a name="l01024"></a>01024 }
<a name="l01025"></a>01025 
<a name="l01026"></a><a class="code" href="playlist-new_8c.html#ad436674bf3d7e427864a03d1b61d5931">01026</a> InputPlugin *<a class="code" href="playlist-new_8c.html#ad436674bf3d7e427864a03d1b61d5931">playlist_entry_get_decoder</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01027"></a>01027 {
<a name="l01028"></a>01028     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01029"></a>01029 
<a name="l01030"></a>01030     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (NULL);
<a name="l01031"></a>01031 
<a name="l01032"></a>01032     <a class="code" href="playlist-new_8c.html#addafbb017bae32d49d15531975f7b5b5">entry_check_has_decoder</a> (<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01033"></a>01033 
<a name="l01034"></a>01034     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#ab7fd18690cdc322405019c3121b6f61d">decoder</a>;
<a name="l01035"></a>01035 }
<a name="l01036"></a>01036 
<a name="l01037"></a><a class="code" href="playlist-new_8c.html#a3ab8907e24d8e764feb13581535b80c2">01037</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a3ab8907e24d8e764feb13581535b80c2">playlist_entry_set_tuple</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num, <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>)
<a name="l01038"></a>01038 {
<a name="l01039"></a>01039     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01040"></a>01040 
<a name="l01041"></a>01041     <a class="code" href="playlist-new_8c.html#ae6725866bae4b338a90ccda66f01afef">LOOKUP_PLAYLIST_ENTRY</a>;
<a name="l01042"></a>01042     <a class="code" href="playlist-new_8c.html#a53eb770c29f70e2a8ef224a89262f6f7">METADATA_WILL_CHANGE</a>;
<a name="l01043"></a>01043 
<a name="l01044"></a>01044     <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="structentry.html">entry</a>, tuple);
<a name="l01045"></a>01045 
<a name="l01046"></a>01046     <a class="code" href="playlist-new_8c.html#a2db4a7dc28fa621180952e4170fc5128">METADATA_HAS_CHANGED</a>;
<a name="l01047"></a>01047 }
<a name="l01048"></a>01048 
<a name="l01049"></a><a class="code" href="playlist-new_8c.html#ad00008a4d8afa94109a44e00d1e8c443">01049</a> <span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="playlist-api_8h.html#a46d5502818b491357ef13a2a03fdcfd3">playlist_entry_get_tuple</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num,
<a name="l01050"></a>01050  <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> fast)
<a name="l01051"></a>01051 {
<a name="l01052"></a>01052     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01053"></a>01053     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (NULL);
<a name="l01054"></a>01054 
<a name="l01055"></a>01055     <span class="keywordflow">if</span> (! fast)
<a name="l01056"></a>01056         <a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">check_scanned</a> (<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01057"></a>01057 
<a name="l01058"></a>01058     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>;
<a name="l01059"></a>01059 }
<a name="l01060"></a>01060 
<a name="l01061"></a><a class="code" href="playlist-new_8c.html#a10c6f4de1cca693ebe8d6c0e3aa96899">01061</a> <span class="keyword">const</span> gchar * <a class="code" href="playlist-new_8c.html#a10c6f4de1cca693ebe8d6c0e3aa96899">playlist_entry_get_title</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num,
<a name="l01062"></a>01062  <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> fast)
<a name="l01063"></a>01063 {
<a name="l01064"></a>01064     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01065"></a>01065     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (NULL);
<a name="l01066"></a>01066 
<a name="l01067"></a>01067     <span class="keywordflow">if</span> (! fast)
<a name="l01068"></a>01068         <a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">check_scanned</a> (<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01069"></a>01069 
<a name="l01070"></a>01070     <span class="keywordflow">return</span> (<a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a> == NULL) ? <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a> : <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a>;
<a name="l01071"></a>01071 }
<a name="l01072"></a>01072 
<a name="l01073"></a><a class="code" href="playlist-new_8c.html#a75946e304c6573d947aec3f10508027d">01073</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#ab992abcff93918543b2231f4e2267d68">playlist_entry_get_length</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num, <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> fast)
<a name="l01074"></a>01074 {
<a name="l01075"></a>01075     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01076"></a>01076     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (0);
<a name="l01077"></a>01077 
<a name="l01078"></a>01078     <span class="keywordflow">if</span> (! fast)
<a name="l01079"></a>01079         <a class="code" href="playlist-new_8c.html#a5123ef08c9847558061b72846f1be8ec">check_scanned</a> (<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01080"></a>01080 
<a name="l01081"></a>01081     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l01082"></a>01082 }
<a name="l01083"></a>01083 
<a name="l01084"></a><a class="code" href="playlist-new_8c.html#ac0e8eadbe1d746ce4fc1a5d1392815e1">01084</a> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#ac0e8eadbe1d746ce4fc1a5d1392815e1">playlist_entry_is_segmented</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01085"></a>01085 {
<a name="l01086"></a>01086     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01087"></a>01087 
<a name="l01088"></a>01088     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (FALSE);
<a name="l01089"></a>01089 
<a name="l01090"></a>01090     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#adf9273ad1fa925931447177139c70d1d">segmented</a>;
<a name="l01091"></a>01091 }
<a name="l01092"></a>01092 
<a name="l01093"></a><a class="code" href="playlist-new_8c.html#a5eea94435643c31ab8aad422d9617876">01093</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a5eea94435643c31ab8aad422d9617876">playlist_entry_get_start_time</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01094"></a>01094 {
<a name="l01095"></a>01095     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01096"></a>01096 
<a name="l01097"></a>01097     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (-1);
<a name="l01098"></a>01098 
<a name="l01099"></a>01099     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a5bf6edf8a827147e29980ab2175ade6a">start</a>;
<a name="l01100"></a>01100 }
<a name="l01101"></a>01101 
<a name="l01102"></a><a class="code" href="playlist-new_8c.html#a7383acbcec3cbf886d5210759af5a5af">01102</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a7383acbcec3cbf886d5210759af5a5af">playlist_entry_get_end_time</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01103"></a>01103 {
<a name="l01104"></a>01104     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01105"></a>01105 
<a name="l01106"></a>01106     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (-1);
<a name="l01107"></a>01107 
<a name="l01108"></a>01108     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#ad81b33105d9563682520a546d90799cd">end</a>;
<a name="l01109"></a>01109 }
<a name="l01110"></a>01110 
<a name="l01111"></a><a class="code" href="playlist-new_8c.html#af5363b67853811340e04abadac916756">01111</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#af5363b67853811340e04abadac916756">playlist_set_position</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01112"></a>01112 {
<a name="l01113"></a>01113     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01114"></a>01114 
<a name="l01115"></a>01115     <span class="keywordflow">if</span> (entry_num == -1)
<a name="l01116"></a>01116     {
<a name="l01117"></a>01117         <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01118"></a>01118         <a class="code" href="structentry.html">entry</a> = NULL;
<a name="l01119"></a>01119     }
<a name="l01120"></a>01120     <span class="keywordflow">else</span>
<a name="l01121"></a>01121         <a class="code" href="playlist-new_8c.html#ae6725866bae4b338a90ccda66f01afef">LOOKUP_PLAYLIST_ENTRY</a>;
<a name="l01122"></a>01122 
<a name="l01123"></a>01123     <span class="keywordflow">if</span> (<a class="code" href="structplaylist.html">playlist</a> == playing_playlist &amp;&amp; <a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l01124"></a>01124         <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a> ();
<a name="l01125"></a>01125 
<a name="l01126"></a>01126     <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (<a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01127"></a>01127 
<a name="l01128"></a>01128     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01129"></a>01129 
<a name="l01130"></a>01130     <a class="code" href="hook_8c.html#a2db1ccd2efbd82b151393e3aedd42550">hook_call</a> (<span class="stringliteral">&quot;playlist position&quot;</span>, GINT_TO_POINTER (playlist_num));
<a name="l01131"></a>01131 }
<a name="l01132"></a>01132 
<a name="l01133"></a><a class="code" href="playlist-new_8c.html#a090486085056d14c9cd85ed2472d7263">01133</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a090486085056d14c9cd85ed2472d7263">playlist_get_position</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01134"></a>01134 {
<a name="l01135"></a>01135     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01136"></a>01136 
<a name="l01137"></a>01137     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (-1);
<a name="l01138"></a>01138 
<a name="l01139"></a>01139     <span class="keywordflow">return</span> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> == NULL) ? -1 : <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>;
<a name="l01140"></a>01140 }
<a name="l01141"></a>01141 
<a name="l01142"></a><a class="code" href="playlist-new_8c.html#ab77f4d2fab83d7ed537edfbe546c4353">01142</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ab77f4d2fab83d7ed537edfbe546c4353">playlist_entry_set_selected</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num, <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01143"></a>01143 {
<a name="l01144"></a>01144     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01145"></a>01145 
<a name="l01146"></a>01146     <a class="code" href="playlist-new_8c.html#ae6725866bae4b338a90ccda66f01afef">LOOKUP_PLAYLIST_ENTRY</a>;
<a name="l01147"></a>01147 
<a name="l01148"></a>01148     <span class="keywordflow">if</span> (<a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a> == selected)
<a name="l01149"></a>01149         <span class="keywordflow">return</span>;
<a name="l01150"></a>01150 
<a name="l01151"></a>01151     <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a> = <a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>;
<a name="l01152"></a>01152 
<a name="l01153"></a>01153     <span class="keywordflow">if</span> (selected)
<a name="l01154"></a>01154     {
<a name="l01155"></a>01155         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a>++;
<a name="l01156"></a>01156         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> += <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l01157"></a>01157     }
<a name="l01158"></a>01158     <span class="keywordflow">else</span>
<a name="l01159"></a>01159     {
<a name="l01160"></a>01160         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a>--;
<a name="l01161"></a>01161         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> -= <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l01162"></a>01162     }
<a name="l01163"></a>01163 
<a name="l01164"></a>01164     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01165"></a>01165 }
<a name="l01166"></a>01166 
<a name="l01167"></a><a class="code" href="playlist-new_8c.html#a3f4152458824146bcd7411c827f2b99b">01167</a> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a3f4152458824146bcd7411c827f2b99b">playlist_entry_get_selected</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01168"></a>01168 {
<a name="l01169"></a>01169     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01170"></a>01170 
<a name="l01171"></a>01171     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (FALSE);
<a name="l01172"></a>01172 
<a name="l01173"></a>01173     <span class="keywordflow">return</span> <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>;
<a name="l01174"></a>01174 }
<a name="l01175"></a>01175 
<a name="l01176"></a><a class="code" href="playlist-new_8c.html#aa18e45d4defdeb70b9372f1decc56d96">01176</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#aa18e45d4defdeb70b9372f1decc56d96">playlist_selected_count</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01177"></a>01177 {
<a name="l01178"></a>01178     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01179"></a>01179 
<a name="l01180"></a>01180     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (0);
<a name="l01181"></a>01181 
<a name="l01182"></a>01182     <span class="keywordflow">return</span> <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a>;
<a name="l01183"></a>01183 }
<a name="l01184"></a>01184 
<a name="l01185"></a><a class="code" href="playlist-new_8c.html#ae0e8e2b5a19fc1f5587a9ad20f59b4fa">01185</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ae0e8e2b5a19fc1f5587a9ad20f59b4fa">playlist_select_all</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01186"></a>01186 {
<a name="l01187"></a>01187     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01188"></a>01188     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01189"></a>01189 
<a name="l01190"></a>01190     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01191"></a>01191 
<a name="l01192"></a>01192     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01193"></a>01193 
<a name="l01194"></a>01194     <span class="keywordflow">for</span> (count = 0; count &lt; entries; count++)
<a name="l01195"></a>01195     {
<a name="l01196"></a>01196         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01197"></a>01197 
<a name="l01198"></a>01198         entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a> = <a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>;
<a name="l01199"></a>01199     }
<a name="l01200"></a>01200 
<a name="l01201"></a>01201     <span class="keywordflow">if</span> (selected)
<a name="l01202"></a>01202     {
<a name="l01203"></a>01203         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a> = entries;
<a name="l01204"></a>01204         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> = <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a>;
<a name="l01205"></a>01205     }
<a name="l01206"></a>01206     <span class="keywordflow">else</span>
<a name="l01207"></a>01207     {
<a name="l01208"></a>01208         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a> = 0;
<a name="l01209"></a>01209         <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> = 0;
<a name="l01210"></a>01210     }
<a name="l01211"></a>01211 
<a name="l01212"></a>01212     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01213"></a>01213 }
<a name="l01214"></a>01214 
<a name="l01215"></a><a class="code" href="playlist-new_8c.html#a83ae5edf84ea66d50cac06f3747adc96">01215</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a83ae5edf84ea66d50cac06f3747adc96">playlist_shift</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> distance)
<a name="l01216"></a>01216 {
<a name="l01217"></a>01217     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01218"></a>01218     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, first, last, shift, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01219"></a>01219     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *move, *others;
<a name="l01220"></a>01220 
<a name="l01221"></a>01221     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (0);
<a name="l01222"></a>01222 
<a name="l01223"></a>01223     <span class="keywordflow">if</span> (! <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01224"></a>01224         <span class="keywordflow">return</span> 0;
<a name="l01225"></a>01225 
<a name="l01226"></a>01226     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l01227"></a>01227 
<a name="l01228"></a>01228     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01229"></a>01229     shift = 0;
<a name="l01230"></a>01230 
<a name="l01231"></a>01231     <span class="keywordflow">for</span> (first = entry_num; first &gt; 0; first--)
<a name="l01232"></a>01232     {
<a name="l01233"></a>01233         <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, first - 1);
<a name="l01234"></a>01234 
<a name="l01235"></a>01235         <span class="keywordflow">if</span> (!<a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01236"></a>01236         {
<a name="l01237"></a>01237             <span class="keywordflow">if</span> (shift &lt;= distance)
<a name="l01238"></a>01238                 <span class="keywordflow">break</span>;
<a name="l01239"></a>01239 
<a name="l01240"></a>01240             shift--;
<a name="l01241"></a>01241         }
<a name="l01242"></a>01242     }
<a name="l01243"></a>01243 
<a name="l01244"></a>01244     <span class="keywordflow">for</span> (last = entry_num; last &lt; entries - 1; last++)
<a name="l01245"></a>01245     {
<a name="l01246"></a>01246         <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, last + 1);
<a name="l01247"></a>01247 
<a name="l01248"></a>01248         <span class="keywordflow">if</span> (!<a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01249"></a>01249         {
<a name="l01250"></a>01250             <span class="keywordflow">if</span> (shift &gt;= distance)
<a name="l01251"></a>01251                 <span class="keywordflow">break</span>;
<a name="l01252"></a>01252 
<a name="l01253"></a>01253             shift++;
<a name="l01254"></a>01254         }
<a name="l01255"></a>01255     }
<a name="l01256"></a>01256 
<a name="l01257"></a>01257     move = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l01258"></a>01258     others = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l01259"></a>01259 
<a name="l01260"></a>01260     <span class="keywordflow">for</span> (count = first; count &lt;= last; count++)
<a name="l01261"></a>01261     {
<a name="l01262"></a>01262         <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01263"></a>01263         <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(<a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a> ? move : others, <a class="code" href="structentry.html">entry</a>);
<a name="l01264"></a>01264     }
<a name="l01265"></a>01265 
<a name="l01266"></a>01266     <span class="keywordflow">if</span> (shift &lt; 0)
<a name="l01267"></a>01267     {
<a name="l01268"></a>01268         <a class="code" href="index_8c.html#ab0613ac09bf5cb4a5267d364c26ec9cf">index_merge_append</a>(move, others);
<a name="l01269"></a>01269         <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(others);
<a name="l01270"></a>01270     }
<a name="l01271"></a>01271     <span class="keywordflow">else</span>
<a name="l01272"></a>01272     {
<a name="l01273"></a>01273         <a class="code" href="index_8c.html#ab0613ac09bf5cb4a5267d364c26ec9cf">index_merge_append</a>(others, move);
<a name="l01274"></a>01274         <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(move);
<a name="l01275"></a>01275         move = others;
<a name="l01276"></a>01276     }
<a name="l01277"></a>01277 
<a name="l01278"></a>01278     <span class="keywordflow">for</span> (count = first; count &lt;= last; count++)
<a name="l01279"></a>01279         <a class="code" href="index_8c.html#aedd2b8d8b84b839e2a9d55716edc9018">index_set</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(move, count - first));
<a name="l01280"></a>01280 
<a name="l01281"></a>01281     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(move);
<a name="l01282"></a>01282 
<a name="l01283"></a>01283     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(<a class="code" href="structplaylist.html">playlist</a>, first, 1 + last - first);
<a name="l01284"></a>01284 
<a name="l01285"></a>01285     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01286"></a>01286     <span class="keywordflow">return</span> shift;
<a name="l01287"></a>01287 }
<a name="l01288"></a>01288 
<a name="l01289"></a><a class="code" href="playlist-new_8c.html#af4b2e3cba915e549c9672f40e18b5510">01289</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#af4b2e3cba915e549c9672f40e18b5510">playlist_delete_selected</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01290"></a>01290 {
<a name="l01291"></a>01291     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01292"></a>01292     <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> stop = FALSE;
<a name="l01293"></a>01293     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01294"></a>01294     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *others;
<a name="l01295"></a>01295 
<a name="l01296"></a>01296     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01297"></a>01297     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l01298"></a>01298 
<a name="l01299"></a>01299     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01300"></a>01300     others = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l01301"></a>01301 
<a name="l01302"></a>01302     <span class="keywordflow">for</span> (count = 0; count &lt; entries; count++)
<a name="l01303"></a>01303     {
<a name="l01304"></a>01304         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01305"></a>01305 
<a name="l01306"></a>01306         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01307"></a>01307         {
<a name="l01308"></a>01308             <span class="keywordflow">if</span> (entry == <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>)
<a name="l01309"></a>01309             {
<a name="l01310"></a>01310                 stop = (<a class="code" href="structplaylist.html">playlist</a> == <a class="code" href="playlist-new_8c.html#a10acb61156324fa4c2d818fc655da621">playing_playlist</a>);
<a name="l01311"></a>01311                 <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (<a class="code" href="structplaylist.html">playlist</a>, NULL);
<a name="l01312"></a>01312             }
<a name="l01313"></a>01313 
<a name="l01314"></a>01314             <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a>)
<a name="l01315"></a>01315                 <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_remove(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, entry);
<a name="l01316"></a>01316 
<a name="l01317"></a>01317             <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a> -= entry-&gt;<a class="code" href="structentry.html#a78780a9aa8cba4b7dd7f8b7c7cfd0f59">length</a>;
<a name="l01318"></a>01318 
<a name="l01319"></a>01319             <a class="code" href="playlist-new_8c.html#ace274769168158e771e7266a3c04e5a9">entry_free</a>(entry);
<a name="l01320"></a>01320         }
<a name="l01321"></a>01321         <span class="keywordflow">else</span>
<a name="l01322"></a>01322             <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(others, entry);
<a name="l01323"></a>01323     }
<a name="l01324"></a>01324 
<a name="l01325"></a>01325     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01326"></a>01326     <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a> = others;
<a name="l01327"></a>01327 
<a name="l01328"></a>01328     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(<a class="code" href="structplaylist.html">playlist</a>, 0, <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>));
<a name="l01329"></a>01329     <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a10323094e451e7082e3ba4e010b9696d">selected_count</a> = 0;
<a name="l01330"></a>01330     <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a> = 0;
<a name="l01331"></a>01331 
<a name="l01332"></a>01332     <span class="keywordflow">if</span> (stop &amp;&amp; <a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l01333"></a>01333         <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a> ();
<a name="l01334"></a>01334 
<a name="l01335"></a>01335     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01336"></a>01336 }
<a name="l01337"></a>01337 
<a name="l01338"></a><a class="code" href="playlist-new_8c.html#a50c62817be1134043a766fcfa241525f">01338</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a50c62817be1134043a766fcfa241525f">playlist_reverse</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01339"></a>01339 {
<a name="l01340"></a>01340     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01341"></a>01341     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01342"></a>01342     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *reversed;
<a name="l01343"></a>01343 
<a name="l01344"></a>01344     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01345"></a>01345     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l01346"></a>01346 
<a name="l01347"></a>01347     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01348"></a>01348     reversed = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l01349"></a>01349     count = entries;
<a name="l01350"></a>01350 
<a name="l01351"></a>01351     <span class="keywordflow">while</span> (count--)
<a name="l01352"></a>01352         <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(reversed, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count));
<a name="l01353"></a>01353 
<a name="l01354"></a>01354     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01355"></a>01355     <a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a> = reversed;
<a name="l01356"></a>01356 
<a name="l01357"></a>01357     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(<a class="code" href="structplaylist.html">playlist</a>, 0, entries);
<a name="l01358"></a>01358 
<a name="l01359"></a>01359     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01360"></a>01360 }
<a name="l01361"></a>01361 
<a name="l01362"></a><a class="code" href="playlist-new_8c.html#a0cf8b056b8533a5992dc9f3ea5b650b4">01362</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a0cf8b056b8533a5992dc9f3ea5b650b4">playlist_randomize</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01363"></a>01363 {
<a name="l01364"></a>01364     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01365"></a>01365     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01366"></a>01366     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l01367"></a>01367 
<a name="l01368"></a>01368     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01369"></a>01369 
<a name="l01370"></a>01370     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> i = 0; i &lt; entries; i ++)
<a name="l01371"></a>01371     {
<a name="l01372"></a>01372         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> j = i + random () % (entries - i);
<a name="l01373"></a>01373 
<a name="l01374"></a>01374         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, j);
<a name="l01375"></a>01375         <a class="code" href="index_8c.html#aedd2b8d8b84b839e2a9d55716edc9018">index_set</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, j, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, i));
<a name="l01376"></a>01376         <a class="code" href="index_8c.html#aedd2b8d8b84b839e2a9d55716edc9018">index_set</a> (<a class="code" href="structplaylist.html">playlist</a>-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, i, entry);
<a name="l01377"></a>01377     }
<a name="l01378"></a>01378 
<a name="l01379"></a>01379     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a> (<a class="code" href="structplaylist.html">playlist</a>, 0, entries);
<a name="l01380"></a>01380     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01381"></a>01381 }
<a name="l01382"></a>01382 
<a name="l01383"></a><a class="code" href="playlist-new_8c.html#a047ad4611e73805a6778693bcdd9e2db">01383</a> <span class="keyword">static</span> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a047ad4611e73805a6778693bcdd9e2db">filename_compare</a> (<span class="keyword">const</span> <span class="keywordtype">void</span> * _a, <span class="keyword">const</span> <span class="keywordtype">void</span> * _b, <span class="keywordtype">void</span> * _compare)
<a name="l01384"></a>01384 {
<a name="l01385"></a>01385     <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a> = _a, * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a> = _b;
<a name="l01386"></a>01386     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare) (<span class="keyword">const</span> gchar * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> gchar * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>) = _compare;
<a name="l01387"></a>01387 
<a name="l01388"></a>01388     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> diff = compare (a-&gt;filename, b-&gt;filename);
<a name="l01389"></a>01389     <span class="keywordflow">if</span> (diff)
<a name="l01390"></a>01390         <span class="keywordflow">return</span> diff;
<a name="l01391"></a>01391 
<a name="l01392"></a>01392     <span class="comment">/* preserve order of &quot;equal&quot; entries */</span>
<a name="l01393"></a>01393     <span class="keywordflow">return</span> a-&gt;number - b-&gt;number;
<a name="l01394"></a>01394 }
<a name="l01395"></a>01395 
<a name="l01396"></a><a class="code" href="playlist-new_8c.html#a14809e8d4e5fc99a32661b60745d0357">01396</a> <span class="keyword">static</span> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a14809e8d4e5fc99a32661b60745d0357">tuple_compare</a> (<span class="keyword">const</span> <span class="keywordtype">void</span> * _a, <span class="keyword">const</span> <span class="keywordtype">void</span> * _b, <span class="keywordtype">void</span> * _compare)
<a name="l01397"></a>01397 {
<a name="l01398"></a>01398     <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a> = _a, * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a> = _b;
<a name="l01399"></a>01399     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare) (<span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>) = _compare;
<a name="l01400"></a>01400 
<a name="l01401"></a>01401     <span class="keywordflow">if</span> (a-&gt;tuple == NULL)
<a name="l01402"></a>01402         <span class="keywordflow">return</span> (b-&gt;tuple == NULL) ? 0 : -1;
<a name="l01403"></a>01403     <span class="keywordflow">if</span> (b-&gt;tuple == NULL)
<a name="l01404"></a>01404         <span class="keywordflow">return</span> 1;
<a name="l01405"></a>01405 
<a name="l01406"></a>01406     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> diff = compare (a-&gt;tuple, b-&gt;tuple);
<a name="l01407"></a>01407     <span class="keywordflow">if</span> (diff)
<a name="l01408"></a>01408         <span class="keywordflow">return</span> diff;
<a name="l01409"></a>01409 
<a name="l01410"></a>01410     <span class="comment">/* preserve order of &quot;equal&quot; entries */</span>
<a name="l01411"></a>01411     <span class="keywordflow">return</span> a-&gt;number - b-&gt;number;
<a name="l01412"></a>01412 }
<a name="l01413"></a>01413 
<a name="l01414"></a><a class="code" href="playlist-new_8c.html#a785890ba4d67ac9541843758b6e421db">01414</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a785890ba4d67ac9541843758b6e421db">sort</a> (<span class="keyword">struct</span> <a class="code" href="structplaylist.html">playlist</a> * <a class="code" href="structplaylist.html">playlist</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare) (<span class="keyword">const</span> <span class="keywordtype">void</span> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>,
<a name="l01415"></a>01415  <span class="keyword">const</span> <span class="keywordtype">void</span> * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>, <span class="keywordtype">void</span> * inner), <span class="keywordtype">void</span> * inner)
<a name="l01416"></a>01416 {
<a name="l01417"></a>01417     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l01418"></a>01418 
<a name="l01419"></a>01419     <a class="code" href="index_8c.html#a7df1a24462999fbc3f409ae1f823761a">index_sort_with_data</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, compare, inner);
<a name="l01420"></a>01420     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a> (playlist, 0, <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>));
<a name="l01421"></a>01421 
<a name="l01422"></a>01422     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01423"></a>01423 }
<a name="l01424"></a>01424 
<a name="l01425"></a><a class="code" href="playlist-new_8c.html#a5773d8511058a606b84b10411ed7d86c">01425</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a5773d8511058a606b84b10411ed7d86c">sort_selected</a> (<span class="keyword">struct</span> playlist * playlist, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare)
<a name="l01426"></a>01426  (<span class="keyword">const</span> <span class="keywordtype">void</span> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> <span class="keywordtype">void</span> * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>, <span class="keywordtype">void</span> * inner), <span class="keywordtype">void</span> * inner)
<a name="l01427"></a>01427 {
<a name="l01428"></a>01428     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>, count2;
<a name="l01429"></a>01429     <span class="keyword">struct </span><a class="code" href="structindex.html">index</a> *selected;
<a name="l01430"></a>01430 
<a name="l01431"></a>01431     <a class="code" href="playlist-new_8c.html#a5cc94cc62f45a994f704de9d437ddfef">PLAYLIST_WILL_CHANGE</a>;
<a name="l01432"></a>01432 
<a name="l01433"></a>01433     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01434"></a>01434     selected = <a class="code" href="index_8c.html#afe2dfc539946e773d628de6dfb37dda5">index_new</a>();
<a name="l01435"></a>01435 
<a name="l01436"></a>01436     <span class="keywordflow">for</span> (count = 0; count &lt; entries; count++)
<a name="l01437"></a>01437     {
<a name="l01438"></a>01438         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01439"></a>01439 
<a name="l01440"></a>01440         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01441"></a>01441             <a class="code" href="index_8c.html#ab6203e3c4c1d82a32ae22c772485ae54">index_append</a>(selected, entry);
<a name="l01442"></a>01442     }
<a name="l01443"></a>01443 
<a name="l01444"></a>01444     <a class="code" href="index_8c.html#a7df1a24462999fbc3f409ae1f823761a">index_sort_with_data</a> (selected, compare, inner);
<a name="l01445"></a>01445 
<a name="l01446"></a>01446     count2 = 0;
<a name="l01447"></a>01447 
<a name="l01448"></a>01448     <span class="keywordflow">for</span> (count = 0; count &lt; entries; count++)
<a name="l01449"></a>01449     {
<a name="l01450"></a>01450         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01451"></a>01451 
<a name="l01452"></a>01452         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01453"></a>01453             <a class="code" href="index_8c.html#aedd2b8d8b84b839e2a9d55716edc9018">index_set</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(selected, count2++));
<a name="l01454"></a>01454     }
<a name="l01455"></a>01455 
<a name="l01456"></a>01456     <a class="code" href="index_8c.html#a213e31de573301849eb6b3258685cae3">index_free</a>(selected);
<a name="l01457"></a>01457     <a class="code" href="playlist-new_8c.html#a80c55245b98487cf1b2c15703570b281">number_entries</a>(playlist, 0, entries);
<a name="l01458"></a>01458 
<a name="l01459"></a>01459     <a class="code" href="playlist-new_8c.html#ab5a87d8fc3f4bba58b462b5f3fdb97a5">PLAYLIST_HAS_CHANGED</a>;
<a name="l01460"></a>01460 }
<a name="l01461"></a>01461 
<a name="l01462"></a><a class="code" href="playlist-new_8c.html#af4be22c9bde3854c3a05ab76b21bde24">01462</a> <span class="keywordtype">void</span> <a class="code" href="playlist-api_8h.html#a8367d612eadee0f577710d8eb4eaf70b">playlist_sort_by_filename</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare)
<a name="l01463"></a>01463  (<span class="keyword">const</span> gchar * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> gchar * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>))
<a name="l01464"></a>01464 {
<a name="l01465"></a>01465     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01466"></a>01466 
<a name="l01467"></a>01467     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01468"></a>01468 
<a name="l01469"></a>01469     <a class="code" href="playlist-new_8c.html#a785890ba4d67ac9541843758b6e421db">sort</a> (playlist, <a class="code" href="playlist-new_8c.html#a047ad4611e73805a6778693bcdd9e2db">filename_compare</a>, compare);
<a name="l01470"></a>01470 }
<a name="l01471"></a>01471 
<a name="l01472"></a><a class="code" href="playlist-new_8c.html#aac81a288edc2c7bfb34c59af693d22bb">01472</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#aac81a288edc2c7bfb34c59af693d22bb">playlist_sort_by_tuple</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare)
<a name="l01473"></a>01473  (<span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>))
<a name="l01474"></a>01474 {
<a name="l01475"></a>01475     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01476"></a>01476     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01477"></a>01477     <a class="code" href="playlist-new_8c.html#aa110eb72a12caa0c60dc62ebb553b80e">check_all_scanned</a> (playlist);
<a name="l01478"></a>01478     <a class="code" href="playlist-new_8c.html#a785890ba4d67ac9541843758b6e421db">sort</a> (playlist, <a class="code" href="playlist-new_8c.html#a14809e8d4e5fc99a32661b60745d0357">tuple_compare</a>, compare);
<a name="l01479"></a>01479 }
<a name="l01480"></a>01480 
<a name="l01481"></a><a class="code" href="playlist-new_8c.html#a928d036f267bc3ce70d14a27aad0e9d3">01481</a> <span class="keywordtype">void</span> <a class="code" href="playlist-api_8h.html#af2fc29bc3c4805b54af5060b12c6b62a">playlist_sort_selected_by_filename</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare)
<a name="l01482"></a>01482  (<span class="keyword">const</span> gchar * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> gchar * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>))
<a name="l01483"></a>01483 {
<a name="l01484"></a>01484     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01485"></a>01485 
<a name="l01486"></a>01486     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01487"></a>01487 
<a name="l01488"></a>01488     <a class="code" href="playlist-new_8c.html#a5773d8511058a606b84b10411ed7d86c">sort_selected</a> (playlist, <a class="code" href="playlist-new_8c.html#a047ad4611e73805a6778693bcdd9e2db">filename_compare</a>, compare);
<a name="l01489"></a>01489 }
<a name="l01490"></a>01490 
<a name="l01491"></a><a class="code" href="playlist-new_8c.html#a076b88a6ca52b328245f064611cb83f9">01491</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a076b88a6ca52b328245f064611cb83f9">playlist_sort_selected_by_tuple</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> (* compare)
<a name="l01492"></a>01492  (<span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="equalizer_8c.html#a21329274c21b67fc478d38001a78d392">a</a>, <span class="keyword">const</span> <a class="code" href="structTuple.html" title="Structure for holding and passing around miscellaneous track metadata.">Tuple</a> * <a class="code" href="equalizer_8c.html#a68195c8196bba3c211db7cdcef429181">b</a>))
<a name="l01493"></a>01493 {
<a name="l01494"></a>01494     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01495"></a>01495     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01496"></a>01496     <a class="code" href="playlist-new_8c.html#a4286d5c380a4265df0c73acc751132ef">check_selected_scanned</a> (playlist);
<a name="l01497"></a>01497     <a class="code" href="playlist-new_8c.html#a5773d8511058a606b84b10411ed7d86c">sort_selected</a> (playlist, <a class="code" href="playlist-new_8c.html#a14809e8d4e5fc99a32661b60745d0357">tuple_compare</a>, compare);
<a name="l01498"></a>01498 }
<a name="l01499"></a>01499 
<a name="l01500"></a><a class="code" href="playlist-new_8c.html#a01d911fe6ab969cba4bc0e5768c8a773">01500</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a01d911fe6ab969cba4bc0e5768c8a773">playlist_reformat_titles</a> (<span class="keywordtype">void</span>)
<a name="l01501"></a>01501 {
<a name="l01502"></a>01502     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num;
<a name="l01503"></a>01503 
<a name="l01504"></a>01504     <a class="code" href="playlist-new_8c.html#a53eb770c29f70e2a8ef224a89262f6f7">METADATA_WILL_CHANGE</a>;
<a name="l01505"></a>01505 
<a name="l01506"></a>01506     <span class="keywordflow">for</span> (playlist_num = 0; playlist_num &lt; <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlists); playlist_num++)
<a name="l01507"></a>01507     {
<a name="l01508"></a>01508         <span class="keyword">struct </span>playlist *playlist = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlists, playlist_num);
<a name="l01509"></a>01509         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a> = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01510"></a>01510         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01511"></a>01511 
<a name="l01512"></a>01512         <span class="keywordflow">for</span> (count = 0; count &lt; <a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>; count++)
<a name="l01513"></a>01513         {
<a name="l01514"></a>01514             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01515"></a>01515 
<a name="l01516"></a>01516             g_free(entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a>);
<a name="l01517"></a>01517             entry-&gt;<a class="code" href="structentry.html#a366ec6b7cef9754472a606a660fe0b01">title</a> = (entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a> == NULL) ? NULL : <a class="code" href="playlist-new_8c.html#a9f16d45c1933eff4ef662b022ec2b73f">title_from_tuple</a>(entry-&gt;<a class="code" href="structentry.html#a9be264183f58a31bee4750a00c81f06e">tuple</a>);
<a name="l01518"></a>01518         }
<a name="l01519"></a>01519     }
<a name="l01520"></a>01520 
<a name="l01521"></a>01521     <a class="code" href="playlist-new_8c.html#a2db4a7dc28fa621180952e4170fc5128">METADATA_HAS_CHANGED</a>;
<a name="l01522"></a>01522 }
<a name="l01523"></a>01523 
<a name="l01524"></a><a class="code" href="playlist-new_8c.html#a746e55b3693a30e0c00f6f24495e5956">01524</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a746e55b3693a30e0c00f6f24495e5956">playlist_rescan</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01525"></a>01525 {
<a name="l01526"></a>01526     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01527"></a>01527     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01528"></a>01528 
<a name="l01529"></a>01529     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01530"></a>01530     <a class="code" href="playlist-new_8c.html#a53eb770c29f70e2a8ef224a89262f6f7">METADATA_WILL_CHANGE</a>;
<a name="l01531"></a>01531 
<a name="l01532"></a>01532     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01533"></a>01533 
<a name="l01534"></a>01534     <span class="keywordflow">for</span> (count = 0; count &lt; entries; count++)
<a name="l01535"></a>01535     {
<a name="l01536"></a>01536         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01537"></a>01537 
<a name="l01538"></a>01538         <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (playlist, entry, NULL);
<a name="l01539"></a>01539         entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a> = FALSE;
<a name="l01540"></a>01540     }
<a name="l01541"></a>01541 
<a name="l01542"></a>01542     <a class="code" href="playlist-new_8c.html#a2db4a7dc28fa621180952e4170fc5128">METADATA_HAS_CHANGED</a>;
<a name="l01543"></a>01543 }
<a name="l01544"></a>01544 
<a name="l01545"></a><a class="code" href="playlist-new_8c.html#a3c7b19ef8575edb97aa6051327299c64">01545</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a3c7b19ef8575edb97aa6051327299c64">playlist_rescan_file</a> (<span class="keyword">const</span> gchar * <a class="code" href="misc-api_8h.html#a820d8643bcfa9e2641dd6377f804de20">filename</a>)
<a name="l01546"></a>01546 {
<a name="l01547"></a>01547     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> num_playlists = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlists);
<a name="l01548"></a>01548     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num;
<a name="l01549"></a>01549 
<a name="l01550"></a>01550     <a class="code" href="playlist-new_8c.html#a53eb770c29f70e2a8ef224a89262f6f7">METADATA_WILL_CHANGE</a>;
<a name="l01551"></a>01551 
<a name="l01552"></a>01552     gchar * copy = NULL;
<a name="l01553"></a>01553     <span class="keywordflow">if</span> (! <a class="code" href="audstrings_8c.html#a139a0a249fe2779da8dc18e93277bf8f">uri_is_utf8</a> (filename, TRUE))
<a name="l01554"></a>01554         filename = copy = <a class="code" href="audstrings_8c.html#af9a9db5b1341fa8d325b0927d8d028fd">uri_to_utf8</a> (filename);
<a name="l01555"></a>01555 
<a name="l01556"></a>01556     <span class="keywordflow">for</span> (playlist_num = 0; playlist_num &lt; num_playlists; playlist_num ++)
<a name="l01557"></a>01557     {
<a name="l01558"></a>01558         <span class="keyword">struct </span>playlist * playlist = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlists, playlist_num);
<a name="l01559"></a>01559         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> num_entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01560"></a>01560         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num;
<a name="l01561"></a>01561 
<a name="l01562"></a>01562         <span class="keywordflow">for</span> (entry_num = 0; entry_num &lt; num_entries; entry_num ++)
<a name="l01563"></a>01563         {
<a name="l01564"></a>01564             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, entry_num);
<a name="l01565"></a>01565 
<a name="l01566"></a>01566             <span class="keywordflow">if</span> (! strcmp (entry-&gt;<a class="code" href="structentry.html#aa3c5f3dc1d5ce3cad729b2887082ed54">filename</a>, filename))
<a name="l01567"></a>01567             {
<a name="l01568"></a>01568                 <a class="code" href="playlist-new_8c.html#a4d48982e44e93fbc61a8fcfab08ad41a">entry_set_tuple</a> (playlist, entry, NULL);
<a name="l01569"></a>01569                 entry-&gt;<a class="code" href="structentry.html#a43dec500662481ed9dbe22f6be67ea8d">failed</a> = FALSE;
<a name="l01570"></a>01570             }
<a name="l01571"></a>01571         }
<a name="l01572"></a>01572     }
<a name="l01573"></a>01573 
<a name="l01574"></a>01574     g_free (copy);
<a name="l01575"></a>01575 
<a name="l01576"></a>01576     <a class="code" href="playlist-new_8c.html#a2db4a7dc28fa621180952e4170fc5128">METADATA_HAS_CHANGED</a>;
<a name="l01577"></a>01577 }
<a name="l01578"></a>01578 
<a name="l01579"></a><a class="code" href="playlist-new_8c.html#a1913a244fbf998f5435809b0a14f53ca">01579</a> gint64 <a class="code" href="playlist-new_8c.html#a1913a244fbf998f5435809b0a14f53ca">playlist_get_total_length</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> fast)
<a name="l01580"></a>01580 {
<a name="l01581"></a>01581     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01582"></a>01582     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (0);
<a name="l01583"></a>01583 
<a name="l01584"></a>01584     <span class="keywordflow">if</span> (! fast)
<a name="l01585"></a>01585         <a class="code" href="playlist-new_8c.html#aa110eb72a12caa0c60dc62ebb553b80e">check_all_scanned</a> (playlist);
<a name="l01586"></a>01586 
<a name="l01587"></a>01587     <span class="keywordflow">return</span> playlist-&gt;<a class="code" href="structplaylist.html#a89a61ea70b4be76502bde14370ac86eb">total_length</a>;
<a name="l01588"></a>01588 }
<a name="l01589"></a>01589 
<a name="l01590"></a><a class="code" href="playlist-new_8c.html#a0f2fbea04dcdbf5de6b8c583d3d0bfdb">01590</a> gint64 <a class="code" href="playlist-new_8c.html#a0f2fbea04dcdbf5de6b8c583d3d0bfdb">playlist_get_selected_length</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> fast)
<a name="l01591"></a>01591 {
<a name="l01592"></a>01592     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01593"></a>01593     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (0);
<a name="l01594"></a>01594 
<a name="l01595"></a>01595     <span class="keywordflow">if</span> (! fast)
<a name="l01596"></a>01596         <a class="code" href="playlist-new_8c.html#a4286d5c380a4265df0c73acc751132ef">check_selected_scanned</a> (playlist);
<a name="l01597"></a>01597 
<a name="l01598"></a>01598     <span class="keywordflow">return</span> playlist-&gt;<a class="code" href="structplaylist.html#a360386f4c00a66ac8d9b8c3bcad03c10">selected_length</a>;
<a name="l01599"></a>01599 }
<a name="l01600"></a>01600 
<a name="l01601"></a><a class="code" href="playlist-new_8c.html#a09758f1ecda1297dca53713502403651">01601</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a09758f1ecda1297dca53713502403651">playlist_queue_count</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01602"></a>01602 {
<a name="l01603"></a>01603     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01604"></a>01604 
<a name="l01605"></a>01605     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (0);
<a name="l01606"></a>01606 
<a name="l01607"></a>01607     <span class="keywordflow">return</span> g_list_length (playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>);
<a name="l01608"></a>01608 }
<a name="l01609"></a>01609 
<a name="l01610"></a><a class="code" href="playlist-new_8c.html#a1acafab1110b6505e7b7f725cc26864d">01610</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a1acafab1110b6505e7b7f725cc26864d">playlist_queue_insert</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01611"></a>01611 {
<a name="l01612"></a>01612     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01613"></a>01613 
<a name="l01614"></a>01614     <a class="code" href="playlist-new_8c.html#ae6725866bae4b338a90ccda66f01afef">LOOKUP_PLAYLIST_ENTRY</a>;
<a name="l01615"></a>01615 
<a name="l01616"></a>01616     <span class="keywordflow">if</span> (<a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a>)
<a name="l01617"></a>01617         <span class="keywordflow">return</span>;
<a name="l01618"></a>01618 
<a name="l01619"></a>01619     <span class="keywordflow">if</span> (at &lt; 0)
<a name="l01620"></a>01620         playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_append(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01621"></a>01621     <span class="keywordflow">else</span>
<a name="l01622"></a>01622         playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_insert(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, <a class="code" href="structentry.html">entry</a>, at);
<a name="l01623"></a>01623 
<a name="l01624"></a>01624     <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a> = TRUE;
<a name="l01625"></a>01625 
<a name="l01626"></a>01626     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01627"></a>01627 }
<a name="l01628"></a>01628 
<a name="l01629"></a><a class="code" href="playlist-new_8c.html#a4d9260506268cd1f67a47ef79551ea89">01629</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a4d9260506268cd1f67a47ef79551ea89">playlist_queue_insert_selected</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>)
<a name="l01630"></a>01630 {
<a name="l01631"></a>01631     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01632"></a>01632     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01633"></a>01633 
<a name="l01634"></a>01634     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01635"></a>01635     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01636"></a>01636 
<a name="l01637"></a>01637     <span class="keywordflow">for</span> (count = 0; count &lt; entries; count++)
<a name="l01638"></a>01638     {
<a name="l01639"></a>01639         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l01640"></a>01640 
<a name="l01641"></a>01641         <span class="keywordflow">if</span> (!entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a> || entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a>)
<a name="l01642"></a>01642             <span class="keywordflow">continue</span>;
<a name="l01643"></a>01643 
<a name="l01644"></a>01644         <span class="keywordflow">if</span> (at &lt; 0)
<a name="l01645"></a>01645             playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_append(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, entry);
<a name="l01646"></a>01646         <span class="keywordflow">else</span>
<a name="l01647"></a>01647             playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_insert(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, entry, at++);
<a name="l01648"></a>01648 
<a name="l01649"></a>01649         entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a> = TRUE;
<a name="l01650"></a>01650     }
<a name="l01651"></a>01651 
<a name="l01652"></a>01652     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01653"></a>01653 }
<a name="l01654"></a>01654 
<a name="l01655"></a><a class="code" href="playlist-new_8c.html#a26957f260d32201ae924d72c191b6ac7">01655</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a26957f260d32201ae924d72c191b6ac7">playlist_queue_get_entry</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>)
<a name="l01656"></a>01656 {
<a name="l01657"></a>01657     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01658"></a>01658     GList *node;
<a name="l01659"></a>01659     <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="playlist-api_8h.html#abaa108414cc2c74407885fb19e375eb7">entry</a>;
<a name="l01660"></a>01660 
<a name="l01661"></a>01661     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (-1);
<a name="l01662"></a>01662     node = g_list_nth(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, at);
<a name="l01663"></a>01663 
<a name="l01664"></a>01664     <span class="keywordflow">if</span> (node == NULL)
<a name="l01665"></a>01665         <span class="keywordflow">return</span> -1;
<a name="l01666"></a>01666 
<a name="l01667"></a>01667     entry = node-&gt;data;
<a name="l01668"></a>01668     <span class="keywordflow">return</span> entry-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>;
<a name="l01669"></a>01669 }
<a name="l01670"></a>01670 
<a name="l01671"></a><a class="code" href="playlist-new_8c.html#a9783b82b47a5f763a763a6ecde2d786f">01671</a> <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-new_8c.html#a9783b82b47a5f763a763a6ecde2d786f">playlist_queue_find_entry</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entry_num)
<a name="l01672"></a>01672 {
<a name="l01673"></a>01673     <a class="code" href="playlist-new_8c.html#ab5663ad4febf88177f59ba6e97eaea79">DECLARE_PLAYLIST_ENTRY</a>;
<a name="l01674"></a>01674 
<a name="l01675"></a>01675     <a class="code" href="playlist-new_8c.html#aceffc0ca5e38575e67b6ae911d0e9c31">LOOKUP_PLAYLIST_ENTRY_RET</a> (-1);
<a name="l01676"></a>01676 
<a name="l01677"></a>01677     <span class="keywordflow">if</span> (! <a class="code" href="structentry.html">entry</a>-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a>)
<a name="l01678"></a>01678         <span class="keywordflow">return</span> -1;
<a name="l01679"></a>01679 
<a name="l01680"></a>01680     <span class="keywordflow">return</span> g_list_index(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, <a class="code" href="structentry.html">entry</a>);
<a name="l01681"></a>01681 }
<a name="l01682"></a>01682 
<a name="l01683"></a><a class="code" href="playlist-new_8c.html#ab709efe0da5c9307d4c94b4c65ecc7c5">01683</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#ab709efe0da5c9307d4c94b4c65ecc7c5">playlist_queue_delete</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="playlist-api_8h.html#af5e8b5caf7672073a7b6cc7131d1d809">at</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a>)
<a name="l01684"></a>01684 {
<a name="l01685"></a>01685     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01686"></a>01686 
<a name="l01687"></a>01687     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01688"></a>01688 
<a name="l01689"></a>01689     <span class="keywordflow">if</span> (at == 0)
<a name="l01690"></a>01690     {
<a name="l01691"></a>01691         <span class="keywordflow">while</span> (playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> != NULL &amp;&amp; number--)
<a name="l01692"></a>01692         {
<a name="l01693"></a>01693             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>-&gt;data;
<a name="l01694"></a>01694 
<a name="l01695"></a>01695             playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_delete_link(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>);
<a name="l01696"></a>01696 
<a name="l01697"></a>01697             entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a> = FALSE;
<a name="l01698"></a>01698         }
<a name="l01699"></a>01699     }
<a name="l01700"></a>01700     <span class="keywordflow">else</span>
<a name="l01701"></a>01701     {
<a name="l01702"></a>01702         GList *anchor = g_list_nth(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, at - 1);
<a name="l01703"></a>01703 
<a name="l01704"></a>01704         <span class="keywordflow">if</span> (anchor == NULL)
<a name="l01705"></a>01705             <span class="keywordflow">goto</span> DONE;
<a name="l01706"></a>01706 
<a name="l01707"></a>01707         <span class="keywordflow">while</span> (anchor-&gt;next != NULL &amp;&amp; number--)
<a name="l01708"></a>01708         {
<a name="l01709"></a>01709             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> *<a class="code" href="structentry.html">entry</a> = anchor-&gt;next-&gt;data;
<a name="l01710"></a>01710 
<a name="l01711"></a>01711             playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_delete_link(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, anchor-&gt;next);
<a name="l01712"></a>01712 
<a name="l01713"></a>01713             entry-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a> = FALSE;
<a name="l01714"></a>01714         }
<a name="l01715"></a>01715     }
<a name="l01716"></a>01716 
<a name="l01717"></a>01717 DONE:
<a name="l01718"></a>01718     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01719"></a>01719 }
<a name="l01720"></a>01720 
<a name="l01721"></a><a class="code" href="playlist-new_8c.html#a4d080e8066c75a4fca92cdb54a57a025">01721</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a4d080e8066c75a4fca92cdb54a57a025">playlist_queue_delete_selected</a> (<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01722"></a>01722 {
<a name="l01723"></a>01723     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01724"></a>01724     <a class="code" href="playlist-new_8c.html#a9562eefa67b718fda4087b65eb56ce92">LOOKUP_PLAYLIST</a>;
<a name="l01725"></a>01725 
<a name="l01726"></a>01726     <span class="keywordflow">for</span> (GList * node = playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>; node != NULL; )
<a name="l01727"></a>01727     {
<a name="l01728"></a>01728         GList * next = node-&gt;next;
<a name="l01729"></a>01729         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = node-&gt;data;
<a name="l01730"></a>01730         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a0288298c941770b2e73e2b56030983cf">selected</a>)
<a name="l01731"></a>01731             playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_delete_link (playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, node);
<a name="l01732"></a>01732         node = next;
<a name="l01733"></a>01733     }
<a name="l01734"></a>01734 
<a name="l01735"></a>01735     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01736"></a>01736 }
<a name="l01737"></a>01737 
<a name="l01738"></a><a class="code" href="playlist-new_8c.html#a9ad2b4ba49544748732a403c2fb3c017">01738</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a9ad2b4ba49544748732a403c2fb3c017">shuffle_prev</a> (<span class="keyword">struct</span> playlist * playlist)
<a name="l01739"></a>01739 {
<a name="l01740"></a>01740     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>), <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01741"></a>01741     <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * found = NULL;
<a name="l01742"></a>01742 
<a name="l01743"></a>01743     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> &lt; entries; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> ++)
<a name="l01744"></a>01744     {
<a name="l01745"></a>01745         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>);
<a name="l01746"></a>01746 
<a name="l01747"></a>01747         <span class="keywordflow">if</span> (entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> &amp;&amp; (playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> == NULL ||
<a name="l01748"></a>01748          entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> &lt; playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>) &amp;&amp; (found == NULL
<a name="l01749"></a>01749          || entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> &gt; found-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>))
<a name="l01750"></a>01750             found = <a class="code" href="playlist-api_8h.html#abaa108414cc2c74407885fb19e375eb7">entry</a>;
<a name="l01751"></a>01751     }
<a name="l01752"></a>01752 
<a name="l01753"></a>01753     <span class="keywordflow">if</span> (found == NULL)
<a name="l01754"></a>01754         <span class="keywordflow">return</span> FALSE;
<a name="l01755"></a>01755 
<a name="l01756"></a>01756     playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> = found;
<a name="l01757"></a>01757     <span class="keywordflow">return</span> TRUE;
<a name="l01758"></a>01758 }
<a name="l01759"></a>01759 
<a name="l01760"></a><a class="code" href="playlist-new_8c.html#a91977416c90daef955ff487a0aba7471">01760</a> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a91977416c90daef955ff487a0aba7471">playlist_prev_song</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num)
<a name="l01761"></a>01761 {
<a name="l01762"></a>01762     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01763"></a>01763 
<a name="l01764"></a>01764     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (FALSE);
<a name="l01765"></a>01765 
<a name="l01766"></a>01766     <span class="keywordflow">if</span> (<a class="code" href="audconfig_8c.html#a98bd56a064259046a6cc6b1a620badf8">cfg</a>.shuffle)
<a name="l01767"></a>01767     {
<a name="l01768"></a>01768         <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#a9ad2b4ba49544748732a403c2fb3c017">shuffle_prev</a> (playlist))
<a name="l01769"></a>01769             <span class="keywordflow">return</span> FALSE;
<a name="l01770"></a>01770     }
<a name="l01771"></a>01771     <span class="keywordflow">else</span>
<a name="l01772"></a>01772     {
<a name="l01773"></a>01773         <span class="keywordflow">if</span> (playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> == NULL || playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> == 0)
<a name="l01774"></a>01774             <span class="keywordflow">return</span> FALSE;
<a name="l01775"></a>01775 
<a name="l01776"></a>01776         <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (playlist, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>,
<a name="l01777"></a>01777          playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> - 1));
<a name="l01778"></a>01778     }
<a name="l01779"></a>01779 
<a name="l01780"></a>01780     <span class="keywordflow">if</span> (playlist == playing_playlist &amp;&amp; <a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l01781"></a>01781         <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a>();
<a name="l01782"></a>01782 
<a name="l01783"></a>01783     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01784"></a>01784 
<a name="l01785"></a>01785     <a class="code" href="hook_8c.html#a2db1ccd2efbd82b151393e3aedd42550">hook_call</a> (<span class="stringliteral">&quot;playlist position&quot;</span>, GINT_TO_POINTER (playlist_num));
<a name="l01786"></a>01786     <span class="keywordflow">return</span> TRUE;
<a name="l01787"></a>01787 }
<a name="l01788"></a>01788 
<a name="l01789"></a><a class="code" href="playlist-new_8c.html#ae213805a86950ade49db4c66e5262752">01789</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#ae213805a86950ade49db4c66e5262752">shuffle_next</a> (<span class="keyword">struct</span> playlist * playlist)
<a name="l01790"></a>01790 {
<a name="l01791"></a>01791     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>), choice = 0, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01792"></a>01792     <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * found = NULL;
<a name="l01793"></a>01793 
<a name="l01794"></a>01794     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> &lt; entries; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> ++)
<a name="l01795"></a>01795     {
<a name="l01796"></a>01796         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>);
<a name="l01797"></a>01797 
<a name="l01798"></a>01798         <span class="keywordflow">if</span> (! entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>)
<a name="l01799"></a>01799             choice ++;
<a name="l01800"></a>01800         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> != NULL &amp;&amp; entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> &gt;
<a name="l01801"></a>01801          playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> &amp;&amp; (found == NULL || entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>
<a name="l01802"></a>01802          &lt; found-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>))
<a name="l01803"></a>01803             found = <a class="code" href="playlist-api_8h.html#abaa108414cc2c74407885fb19e375eb7">entry</a>;
<a name="l01804"></a>01804     }
<a name="l01805"></a>01805 
<a name="l01806"></a>01806     <span class="keywordflow">if</span> (found != NULL)
<a name="l01807"></a>01807     {
<a name="l01808"></a>01808         playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> = found;
<a name="l01809"></a>01809         <span class="keywordflow">return</span> TRUE;
<a name="l01810"></a>01810     }
<a name="l01811"></a>01811 
<a name="l01812"></a>01812     <span class="keywordflow">if</span> (! choice)
<a name="l01813"></a>01813         <span class="keywordflow">return</span> FALSE;
<a name="l01814"></a>01814 
<a name="l01815"></a>01815     choice = random () % choice;
<a name="l01816"></a>01816 
<a name="l01817"></a>01817     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; ; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> ++)
<a name="l01818"></a>01818     {
<a name="l01819"></a>01819         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>);
<a name="l01820"></a>01820 
<a name="l01821"></a>01821         <span class="keywordflow">if</span> (! entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>)
<a name="l01822"></a>01822         {
<a name="l01823"></a>01823             <span class="keywordflow">if</span> (! choice)
<a name="l01824"></a>01824             {
<a name="l01825"></a>01825                 <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (playlist, entry);
<a name="l01826"></a>01826                 <span class="keywordflow">return</span> TRUE;
<a name="l01827"></a>01827             }
<a name="l01828"></a>01828 
<a name="l01829"></a>01829             choice --;
<a name="l01830"></a>01830         }
<a name="l01831"></a>01831     }
<a name="l01832"></a>01832 }
<a name="l01833"></a>01833 
<a name="l01834"></a><a class="code" href="playlist-new_8c.html#a4919df3197bb084554c0a87ec4de2fe5">01834</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a4919df3197bb084554c0a87ec4de2fe5">shuffle_reset</a> (<span class="keyword">struct</span> playlist * playlist)
<a name="l01835"></a>01835 {
<a name="l01836"></a>01836     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>), <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01837"></a>01837 
<a name="l01838"></a>01838     playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a> = 0;
<a name="l01839"></a>01839 
<a name="l01840"></a>01840     <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> &lt; entries; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> ++)
<a name="l01841"></a>01841     {
<a name="l01842"></a>01842         <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>);
<a name="l01843"></a>01843 
<a name="l01844"></a>01844         entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a> = 0;
<a name="l01845"></a>01845     }
<a name="l01846"></a>01846 }
<a name="l01847"></a>01847 
<a name="l01848"></a><a class="code" href="playlist-new_8c.html#aed4ff077093e9de0240f44d403fb2124">01848</a> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#aed4ff077093e9de0240f44d403fb2124">playlist_next_song</a>(<a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> repeat)
<a name="l01849"></a>01849 {
<a name="l01850"></a>01850     <a class="code" href="playlist-new_8c.html#af6fbcb082ccd659c8fc890306ad52f99">DECLARE_PLAYLIST</a>;
<a name="l01851"></a>01851     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> entries;
<a name="l01852"></a>01852 
<a name="l01853"></a>01853     <a class="code" href="playlist-new_8c.html#a7fca6a2bf51f47dfa0c0c9ed71c47c47">LOOKUP_PLAYLIST_RET</a> (FALSE);
<a name="l01854"></a>01854     entries = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a>(playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>);
<a name="l01855"></a>01855 
<a name="l01856"></a>01856     <span class="keywordflow">if</span> (entries == 0)
<a name="l01857"></a>01857         <span class="keywordflow">return</span> FALSE;
<a name="l01858"></a>01858 
<a name="l01859"></a>01859     <span class="comment">/* If we have a song in queue, jump to it, _then_ remove it from queue */</span>
<a name="l01860"></a>01860     <span class="keywordflow">if</span> (playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> != NULL)
<a name="l01861"></a>01861     {
<a name="l01862"></a>01862         <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (playlist, playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>-&gt;data);
<a name="l01863"></a>01863 
<a name="l01864"></a>01864         playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a> = g_list_remove(playlist-&gt;<a class="code" href="structplaylist.html#a8673492691f83e381d89f64a6e22dbd9">queued</a>, playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>);
<a name="l01865"></a>01865         playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a6a54000af6b138b284e394eceb9e9dcf">queued</a> = FALSE;
<a name="l01866"></a>01866     }
<a name="l01867"></a>01867     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="audconfig_8c.html#a98bd56a064259046a6cc6b1a620badf8">cfg</a>.shuffle)
<a name="l01868"></a>01868     {
<a name="l01869"></a>01869         <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#ae213805a86950ade49db4c66e5262752">shuffle_next</a> (playlist))
<a name="l01870"></a>01870         {
<a name="l01871"></a>01871             <span class="keywordflow">if</span> (! repeat)
<a name="l01872"></a>01872                 <span class="keywordflow">return</span> FALSE;
<a name="l01873"></a>01873 
<a name="l01874"></a>01874             <a class="code" href="playlist-new_8c.html#a4919df3197bb084554c0a87ec4de2fe5">shuffle_reset</a> (playlist);
<a name="l01875"></a>01875 
<a name="l01876"></a>01876             <span class="keywordflow">if</span> (! <a class="code" href="playlist-new_8c.html#ae213805a86950ade49db4c66e5262752">shuffle_next</a> (playlist))
<a name="l01877"></a>01877                 <span class="keywordflow">return</span> FALSE;
<a name="l01878"></a>01878         }
<a name="l01879"></a>01879     }
<a name="l01880"></a>01880     <span class="keywordflow">else</span>
<a name="l01881"></a>01881     {
<a name="l01882"></a>01882         <span class="keywordflow">if</span> (playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> == NULL)
<a name="l01883"></a>01883             <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (playlist, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, 0));
<a name="l01884"></a>01884         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> == entries - 1)
<a name="l01885"></a>01885         {
<a name="l01886"></a>01886             <span class="keywordflow">if</span> (!repeat)
<a name="l01887"></a>01887                 <span class="keywordflow">return</span> FALSE;
<a name="l01888"></a>01888 
<a name="l01889"></a>01889             <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (playlist, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, 0));
<a name="l01890"></a>01890         }
<a name="l01891"></a>01891         <span class="keywordflow">else</span>
<a name="l01892"></a>01892             <a class="code" href="playlist-new_8c.html#a24701643f23c446d9becd70992ae52c2">set_position</a> (playlist, <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>,
<a name="l01893"></a>01893              playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>-&gt;<a class="code" href="structentry.html#a181fdc6bdc0f80db0e289d8ac46fab7b">number</a> + 1));
<a name="l01894"></a>01894     }
<a name="l01895"></a>01895 
<a name="l01896"></a>01896     <span class="keywordflow">if</span> (playlist == playing_playlist &amp;&amp; <a class="code" href="playback_8c.html#aafc1a680d8f23633c84f247112715095">playback_get_playing</a> ())
<a name="l01897"></a>01897         <a class="code" href="playback_8c.html#a37316a2d8c857f7ee39ecf339f63a551">playback_stop</a>();
<a name="l01898"></a>01898 
<a name="l01899"></a>01899     <a class="code" href="playlist-new_8c.html#a6f1815cf79b87db544eaa46a25940f57">SELECTION_HAS_CHANGED</a>;
<a name="l01900"></a>01900 
<a name="l01901"></a>01901     <a class="code" href="hook_8c.html#a2db1ccd2efbd82b151393e3aedd42550">hook_call</a> (<span class="stringliteral">&quot;playlist position&quot;</span>, GINT_TO_POINTER (playlist_num));
<a name="l01902"></a>01902     <span class="keywordflow">return</span> TRUE;
<a name="l01903"></a>01903 }
<a name="l01904"></a>01904 
<a name="l01905"></a><a class="code" href="playlist-new_8c.html#a9542792af2ce761406ff4416679043cf">01905</a> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a9542792af2ce761406ff4416679043cf">playlist_update_pending</a> (<span class="keywordtype">void</span>)
<a name="l01906"></a>01906 {
<a name="l01907"></a>01907     <span class="keywordflow">return</span> (<a class="code" href="playlist-new_8c.html#a399fc8c908686eea19643867ef3523b9">update_source</a> != 0);
<a name="l01908"></a>01908 }
<a name="l01909"></a>01909 
<a name="l01910"></a><a class="code" href="playlist-new_8c.html#aa028044c2951163d333f246f5b146623">01910</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#aa028044c2951163d333f246f5b146623">playlist_save_state</a> (<span class="keywordtype">void</span>)
<a name="l01911"></a>01911 {
<a name="l01912"></a>01912     gchar scratch[512];
<a name="l01913"></a>01913     FILE * handle;
<a name="l01914"></a>01914     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num;
<a name="l01915"></a>01915 
<a name="l01916"></a>01916     snprintf (scratch, <span class="keyword">sizeof</span> scratch, <span class="stringliteral">&quot;%s/&quot;</span> <a class="code" href="playlist-new_8c.html#ad234a3a597901e6298cfa77780eb30bf">STATE_FILE</a>,
<a name="l01917"></a>01917      <a class="code" href="main_8c.html#a3712c2260dd091b528739d8e96ecf052">aud_paths</a>[<a class="code" href="main_8h.html#ab04a0655cd1e3bcac5e8f48c18df1a57a32379532119b30253f9dd8e315323f5c">BMP_PATH_USER_DIR</a>]);
<a name="l01918"></a>01918     handle = fopen (scratch, <span class="stringliteral">&quot;w&quot;</span>);
<a name="l01919"></a>01919 
<a name="l01920"></a>01920     <span class="keywordflow">if</span> (handle == NULL)
<a name="l01921"></a>01921         <span class="keywordflow">return</span>;
<a name="l01922"></a>01922 
<a name="l01923"></a>01923     fprintf (handle, <span class="stringliteral">&quot;active %d\n&quot;</span>, <a class="code" href="playlist-new_8c.html#a32abcfcf28e68da7c91b21db688e85f3">playlist_get_active</a> ());
<a name="l01924"></a>01924     fprintf (handle, <span class="stringliteral">&quot;playing %d\n&quot;</span>, <a class="code" href="playlist-new_8c.html#a9148257b8f1ae313fc9176aea46221ee">playlist_get_playing</a> ());
<a name="l01925"></a>01925 
<a name="l01926"></a>01926     <span class="keywordflow">for</span> (playlist_num = 0; playlist_num &lt; <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlists);
<a name="l01927"></a>01927      playlist_num ++)
<a name="l01928"></a>01928     {
<a name="l01929"></a>01929         <span class="keyword">struct </span>playlist * playlist = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlists, playlist_num);
<a name="l01930"></a>01930         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a> = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>), <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l01931"></a>01931 
<a name="l01932"></a>01932         fprintf (handle, <span class="stringliteral">&quot;playlist %d\n&quot;</span>, playlist_num);
<a name="l01933"></a>01933         fprintf (handle, <span class="stringliteral">&quot;position %d\n&quot;</span>, <a class="code" href="playlist-new_8c.html#a090486085056d14c9cd85ed2472d7263">playlist_get_position</a> (playlist_num));
<a name="l01934"></a>01934         fprintf (handle, <span class="stringliteral">&quot;last-shuffled %d\n&quot;</span>, playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a>);
<a name="l01935"></a>01935 
<a name="l01936"></a>01936         <span class="keywordflow">for</span> (<a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> = 0; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> &lt; <a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>; <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a> ++)
<a name="l01937"></a>01937         {
<a name="l01938"></a>01938             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>);
<a name="l01939"></a>01939 
<a name="l01940"></a>01940             fprintf (handle, <span class="stringliteral">&quot;S %d\n&quot;</span>, entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>);
<a name="l01941"></a>01941         }
<a name="l01942"></a>01942     }
<a name="l01943"></a>01943 
<a name="l01944"></a>01944     fclose (handle);
<a name="l01945"></a>01945 }
<a name="l01946"></a>01946 
<a name="l01947"></a><a class="code" href="playlist-new_8c.html#a3044cebd947f5bc956eeaa21fc3420d6">01947</a> <span class="keyword">static</span> gchar <a class="code" href="playlist-new_8c.html#a3044cebd947f5bc956eeaa21fc3420d6">parse_key</a>[32];
<a name="l01948"></a><a class="code" href="playlist-new_8c.html#a17929e981b71f71f8b10d8e3984c95eb">01948</a> <span class="keyword">static</span> gchar * <a class="code" href="playlist-new_8c.html#a17929e981b71f71f8b10d8e3984c95eb">parse_value</a>;
<a name="l01949"></a>01949 
<a name="l01950"></a><a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">01950</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (FILE * handle)
<a name="l01951"></a>01951 {
<a name="l01952"></a>01952     gchar * found;
<a name="l01953"></a>01953 
<a name="l01954"></a>01954     parse_value = NULL;
<a name="l01955"></a>01955 
<a name="l01956"></a>01956     <span class="keywordflow">if</span> (fgets (parse_key, <span class="keyword">sizeof</span> parse_key, handle) == NULL)
<a name="l01957"></a>01957         <span class="keywordflow">return</span>;
<a name="l01958"></a>01958 
<a name="l01959"></a>01959     found = strchr (parse_key, <span class="charliteral">&#39; &#39;</span>);
<a name="l01960"></a>01960 
<a name="l01961"></a>01961     <span class="keywordflow">if</span> (found == NULL)
<a name="l01962"></a>01962         <span class="keywordflow">return</span>;
<a name="l01963"></a>01963 
<a name="l01964"></a>01964     * found = 0;
<a name="l01965"></a>01965     parse_value = found + 1;
<a name="l01966"></a>01966 
<a name="l01967"></a>01967     found = strchr (parse_value, <span class="charliteral">&#39;\n&#39;</span>);
<a name="l01968"></a>01968 
<a name="l01969"></a>01969     <span class="keywordflow">if</span> (found != NULL)
<a name="l01970"></a>01970         * found = 0;
<a name="l01971"></a>01971 }
<a name="l01972"></a>01972 
<a name="l01973"></a><a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">01973</a> <span class="keyword">static</span> <a class="code" href="configdb-api_8h.html#a3ac4dad7ee7fd2890139bff9a134ee9a">gboolean</a> <a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="keyword">const</span> gchar * <a class="code" href="configdb-api_8h.html#a38fda4676b99f6c8df6a7fd772335d7d">key</a>, <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> * value)
<a name="l01974"></a>01974 {
<a name="l01975"></a>01975     <span class="keywordflow">return</span> (parse_value != NULL &amp;&amp; ! strcmp (parse_key, key) &amp;&amp; sscanf
<a name="l01976"></a>01976      (parse_value, <span class="stringliteral">&quot;%d&quot;</span>, value) == 1);
<a name="l01977"></a>01977 }
<a name="l01978"></a>01978 
<a name="l01979"></a><a class="code" href="playlist-new_8c.html#af9ca285c9583c9311b47fa7bb2383626">01979</a> <span class="keywordtype">void</span> <a class="code" href="playlist-new_8c.html#af9ca285c9583c9311b47fa7bb2383626">playlist_load_state</a> (<span class="keywordtype">void</span>)
<a name="l01980"></a>01980 {
<a name="l01981"></a>01981     gchar scratch[512];
<a name="l01982"></a>01982     FILE * handle;
<a name="l01983"></a>01983     <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> playlist_num, obsolete = 0;
<a name="l01984"></a>01984 
<a name="l01985"></a>01985     snprintf (scratch, <span class="keyword">sizeof</span> scratch, <span class="stringliteral">&quot;%s/&quot;</span> <a class="code" href="playlist-new_8c.html#ad234a3a597901e6298cfa77780eb30bf">STATE_FILE</a>,
<a name="l01986"></a>01986      <a class="code" href="main_8c.html#a3712c2260dd091b528739d8e96ecf052">aud_paths</a>[<a class="code" href="main_8h.html#ab04a0655cd1e3bcac5e8f48c18df1a57a32379532119b30253f9dd8e315323f5c">BMP_PATH_USER_DIR</a>]);
<a name="l01987"></a>01987     handle = fopen (scratch, <span class="stringliteral">&quot;r&quot;</span>);
<a name="l01988"></a>01988 
<a name="l01989"></a>01989     <span class="keywordflow">if</span> (handle == NULL)
<a name="l01990"></a>01990         <span class="keywordflow">return</span>;
<a name="l01991"></a>01991 
<a name="l01992"></a>01992     <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l01993"></a>01993 
<a name="l01994"></a>01994     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;active&quot;</span>, &amp; playlist_num))
<a name="l01995"></a>01995     {
<a name="l01996"></a>01996         <a class="code" href="playlist-new_8c.html#af34d9eaa4d82c7878e86c8db6e69c7d7">playlist_set_active</a> (playlist_num);
<a name="l01997"></a>01997         <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l01998"></a>01998     }
<a name="l01999"></a>01999 
<a name="l02000"></a>02000     <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;playing&quot;</span>, &amp; playlist_num))
<a name="l02001"></a>02001     {
<a name="l02002"></a>02002         <a class="code" href="playlist-new_8c.html#a899f846c0ea0d1ec3a44c891ddb5d1cc">playlist_set_playing</a> (playlist_num);
<a name="l02003"></a>02003         <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l02004"></a>02004     }
<a name="l02005"></a>02005 
<a name="l02006"></a>02006     <span class="keywordflow">while</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;playlist&quot;</span>, &amp; playlist_num) &amp;&amp; playlist_num &gt;= 0 &amp;&amp;
<a name="l02007"></a>02007      playlist_num &lt; <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlists))
<a name="l02008"></a>02008     {
<a name="l02009"></a>02009         <span class="keyword">struct </span>playlist * playlist = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlists, playlist_num);
<a name="l02010"></a>02010         <a class="code" href="misc-api_8h.html#acf599c059f43e0cca83145eb6b0c93cd">gint</a> <a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a> = <a class="code" href="index_8c.html#a001a8f1e7f767f681aa316c2bbd0dbb8">index_count</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>), <a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>, <a class="code" href="misc-api_8h.html#ac0c64a48f21e0d91f7340acdb9cc6409">count</a>;
<a name="l02011"></a>02011 
<a name="l02012"></a>02012         <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l02013"></a>02013 
<a name="l02014"></a>02014         <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;position&quot;</span>, &amp; <a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>))
<a name="l02015"></a>02015             <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l02016"></a>02016 
<a name="l02017"></a>02017         <span class="keywordflow">if</span> (<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> &gt;= 0 &amp;&amp; <a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> &lt; entries)
<a name="l02018"></a>02018             playlist-&gt;<a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, <a class="code" href="structplaylist.html#aecf3c0a5c08a29437322797396b235e8">position</a>);
<a name="l02019"></a>02019 
<a name="l02020"></a>02020         <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;shuffled&quot;</span>, &amp; obsolete)) <span class="comment">/* compatibility with 2.3 */</span>
<a name="l02021"></a>02021             <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l02022"></a>02022 
<a name="l02023"></a>02023         <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;last-shuffled&quot;</span>, &amp; playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a>))
<a name="l02024"></a>02024             <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l02025"></a>02025         <span class="keywordflow">else</span> <span class="comment">/* compatibility with 2.3 beta */</span>
<a name="l02026"></a>02026             playlist-&gt;<a class="code" href="structplaylist.html#a37bd1604856a5dee9d6d723bfd39fdec">last_shuffle_num</a> = obsolete;
<a name="l02027"></a>02027 
<a name="l02028"></a>02028         <span class="keywordflow">for</span> (count = 0; count &lt; <a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>; count ++)
<a name="l02029"></a>02029         {
<a name="l02030"></a>02030             <span class="keyword">struct </span><a class="code" href="structentry.html">entry</a> * <a class="code" href="structentry.html">entry</a> = <a class="code" href="index_8c.html#a2b1faa63b8f9d513704a904740d11a7d">index_get</a> (playlist-&gt;<a class="code" href="structplaylist.html#aeab7bb1baa8812c94d4f7873ddcfe5fd">entries</a>, count);
<a name="l02031"></a>02031 
<a name="l02032"></a>02032             <span class="keywordflow">if</span> (<a class="code" href="playlist-new_8c.html#a5115672a0a12d64321dcdbfb1295b222">parse_integer</a> (<span class="stringliteral">&quot;S&quot;</span>, &amp; entry-&gt;<a class="code" href="structentry.html#a6f16f1272db7512c40e64a2ad60600ad">shuffle_num</a>))
<a name="l02033"></a>02033                 <a class="code" href="playlist-new_8c.html#a431927f340ccbad4c71d1eda429896aa">parse_next</a> (handle);
<a name="l02034"></a>02034         }
<a name="l02035"></a>02035     }
<a name="l02036"></a>02036 
<a name="l02037"></a>02037     fclose (handle);
<a name="l02038"></a>02038 }
</pre></div></div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Sun Apr 17 2011 for Audacious by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address>
</body>
</html>