# HG changeset patch # User Andrew O. Shadoura # Date 1215823195 -10800 # Node ID 9e06acde819e34e31cd546cac1aa77cb988a7f9f # Parent 2d3594eaa18a7cca27927489830ecb1e3d63348b# Parent 11fb1503ee4babbf8d020f0f106b542abcfdf680 branch merge diff -r 2d3594eaa18a -r 9e06acde819e po/ja.po --- a/po/ja.po Sat Jul 12 03:39:25 2008 +0300 +++ b/po/ja.po Sat Jul 12 03:39:55 2008 +0300 @@ -14,7 +14,7 @@ "Project-Id-Version: audacious-plugins HEAD\n" "Report-Msgid-Bugs-To: http://bugzilla.atheme.org/\n" "POT-Creation-Date: 2008-06-21 08:27+0300\n" -"PO-Revision-Date: 2008-03-31 15:01+0900\n" +"PO-Revision-Date: 2008-07-08 13:10+0900\n" "Last-Translator: dai \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" @@ -1483,7 +1483,7 @@ #: src/amidi-plug/i_fileinfo.c:349 msgid " (invalid UTF-8)" -msgstr " (無効な UTF-8)" +msgstr " (不正な UTF-8)" #: src/amidi-plug/i_utils.c:43 msgid "AMIDI-Plug - about" @@ -2027,9 +2027,9 @@ "\n" "No CD inserted, or inserted CD is not an audio CD.\n" msgstr "" -"演奏可能な CD が見つかりません.\n" -"\n" -"CD が挿入されていないか, オーディオ CD ではありません.\n" +"演奏できる CD が見つかりませんでした.\n" +"\n" +"CD が挿入されていないか, 挿入された CD はオーディオ CD ではありません.\n" #: src/cdaudio-ng/configure.c:155 msgid "CD Audio Plugin Configuration" @@ -2060,9 +2060,8 @@ msgstr "サーバ: " #: src/cdaudio-ng/configure.c:205 -#, fuzzy msgid "Path: " -msgstr "パターン: " +msgstr "パス: " #: src/cdaudio-ng/configure.c:208 msgid "Port: " @@ -2154,9 +2153,8 @@ "Shay Green によります." #: src/crystalizer/crystalizer.c:90 -#, fuzzy msgid "Configure Crystalizer" -msgstr "エクストラステレオの設定" +msgstr "Crystalizer の設定" #: src/crystalizer/crystalizer.c:92 src/stereo_plugin/stereo.c:94 msgid "Effect intensity:" @@ -2799,7 +2797,7 @@ #: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507 msgid "Quality" -msgstr "品質" +msgstr "音質" #: src/filewriter/mp3.c:994 msgid "Enable VBR/ABR" @@ -2959,7 +2957,7 @@ #: src/hotkey/gui.c:69 src/skins/ui_manager.c:177 src/skins/ui_manager.c:178 msgid "Play" -msgstr "演奏開始" +msgstr "演奏" #: src/hotkey/gui.c:70 msgid "Pause/Resume" @@ -2967,7 +2965,7 @@ #: src/hotkey/gui.c:71 src/skins/ui_manager.c:183 src/skins/ui_manager.c:184 msgid "Stop" -msgstr "演奏停止" +msgstr "停止" #: src/hotkey/gui.c:72 msgid "Next Track" @@ -2995,7 +2993,7 @@ #: src/hotkey/gui.c:78 src/skins/ui_manager.c:422 src/skins/ui_manager.c:423 msgid "Jump to File" -msgstr "指定ファイルへ移動" +msgstr "指定したファイルへ移動" #: src/hotkey/gui.c:79 msgid "Toggle Player Windows" @@ -4524,6 +4522,15 @@ "\n" "subsong-num, subsong-id" msgstr "" +"SID 特有のタプルフィールド:\n" +"\n" +"sid-format\t\t- 特有のファイルフォーマット\n" +"sid-model\t\t- 6581 か 8580\n" +"sid-speed\t\t- タイミングか速さ: PAL/NTSC/etc.\n" +"\n" +"他の \"特別な\" フィールド:\n" +"\n" +"subsong-num, subsong-id" #: src/sid/xmms-sid.glade:2581 src/sid/xs_interface.c:1097 msgid "Song title format:" @@ -4692,140 +4699,138 @@ #: src/skins/plugin.c:128 msgid "About Skinned GUI" -msgstr "" +msgstr "スキン GUI について" #: src/skins/plugin.c:129 msgid "" "Copyright (c) 2008, by Tomasz Moń \n" "\n" msgstr "" +"Copyright (c) 2008, by Tomasz Moń \n" +"\n" #: src/skins/skins_cfg.c:329 -#, fuzzy msgid "_Fonts" -msgstr "動作:" +msgstr "フォント(_F)" #: src/skins/skins_cfg.c:330 -#, fuzzy msgid "_Player:" -msgstr "演奏時間:" +msgstr "プレイヤ(_P):" #: src/skins/skins_cfg.c:330 msgid "Select main player window font:" -msgstr "" +msgstr "メインウィンドウで使用するフォントの選択" #: src/skins/skins_cfg.c:331 -#, fuzzy msgid "_Playlist:" -msgstr "プレイリストの選択" +msgstr "プレイリスト(_P):" #: src/skins/skins_cfg.c:331 -#, fuzzy msgid "Select playlist font:" -msgstr "プレイリストの選択" +msgstr "プレイリストで使用するフォントの選択" #: src/skins/skins_cfg.c:332 -#, fuzzy msgid "Use Bitmap fonts if available" -msgstr "有効ならば CDDB を使う" +msgstr "可能ならばビットマップフォントを使用" #: src/skins/skins_cfg.c:332 msgid "" "Use bitmap fonts if they are available. Bitmap fonts do not support Unicode " "strings." msgstr "" +"可能ならばビットマップフォントを使用します. ビットマップフォントは Unicode 文" +"字列をサポートしていません." #: src/skins/skins_cfg.c:333 -#, fuzzy msgid "_Miscellaneous" -msgstr "サービス" +msgstr "その他(_M)" #: src/skins/skins_cfg.c:334 msgid "Show track numbers in playlist" -msgstr "" +msgstr "プレイリストにトラック番号を表示する" #: src/skins/skins_cfg.c:336 msgid "Show separators in playlist" -msgstr "" +msgstr "プレイリストの区切り線を表示する" #: src/skins/skins_cfg.c:338 msgid "Show window manager decoration" -msgstr "" +msgstr "ウィンドウマネージャ装飾を表示する" #: src/skins/skins_cfg.c:339 msgid "This enables the window manager to show decorations for windows." -msgstr "" +msgstr "ウィンドウマネージャによるウィンドウ装飾を有効にします." #: src/skins/skins_cfg.c:340 msgid "Use two-way text scroller" -msgstr "" +msgstr "双方向テキストスクロールを使う" #: src/skins/skins_cfg.c:341 msgid "" "If selected, the file information text in the main window will scroll back " "and forth. If not selected, the text will only scroll in one direction." msgstr "" +"これを使うと,メインウィンドウのファイル情報テキストが前後にスクロールしま" +"す.そうでなければ,テキストは一方向のみにスクロールします." #: src/skins/skins_cfg.c:342 msgid "Disable inline gtk theme" -msgstr "" +msgstr "インライン GTK テーマを無効にする" #: src/skins/skins_cfg.c:343 msgid "Allow loading incomplete skins" -msgstr "" +msgstr "不完全なスキンの読み込みを許可する" #: src/skins/skins_cfg.c:344 msgid "" "If selected, audacious won't refuse loading broken skins. Use only if your " "favourite skin doesn't work" msgstr "" +"これを使うと,audacious は壊れたスキンの読み込みを拒絶しません.お気に入りの" +"スキンが動かないときだけ使用してください." #: src/skins/skins_cfg.c:410 msgid "Color Adjustment" -msgstr "" +msgstr "色補正" #: src/skins/skins_cfg.c:417 msgid "" "Audacious allows you to alter the color balance of the skinned UI. The " "sliders below will allow you to do this." -msgstr "" +msgstr "以下のスライダを用いてスキン UI の色合いの変更ができます." #: src/skins/skins_cfg.c:427 -#, fuzzy msgid "Blue" -msgstr "ブルース" +msgstr "青" #: src/skins/skins_cfg.c:434 msgid "Green" -msgstr "" +msgstr "緑" #: src/skins/skins_cfg.c:441 msgid "Red" -msgstr "" +msgstr "赤" #: src/skins/skins_cfg.c:571 -#, fuzzy msgid "Audacious Skinned GUI Configuration" -msgstr "Audacious OSD - 設定" +msgstr "Audacious スキン GUI 設定" #: src/skins/skins_cfg.c:596 -#, fuzzy msgid "_Skin" -msgstr "動作:" +msgstr "スキン(_S)" #: src/skins/ui_equalizer.c:494 -#, fuzzy msgid "Audacious Equalizer" -msgstr "ウィンドウ->イコライザー" +msgstr "Audacious イコライザ" #: src/skins/ui_equalizer.c:794 -#, fuzzy, c-format +#, c-format msgid "Error importing Winamp EQF file '%s'" -msgstr "pixmap ファイルの読み込みエラー: %s" +msgstr "Winamp EQF ファイル '%s' のインポートエラー" #: src/skins/ui_equalizer.c:1172 msgid "Presets" -msgstr "" +msgstr "プリセット" #: src/skins/ui_main.c:392 #, c-format @@ -4833,57 +4838,49 @@ msgstr "%s - Audacious" #: src/skins/ui_main.c:394 src/skins/ui_main.c:2397 -#, fuzzy msgid "Audacious" -msgstr "%s - Audacious" +msgstr "Audacious" #: src/skins/ui_main.c:641 -#, fuzzy msgid "VBR" -msgstr "VBR/ABR" +msgstr "VBR" #: src/skins/ui_main.c:659 src/skins/ui_main.c:663 -#, fuzzy msgid "stereo" msgstr "ステレオ" #: src/skins/ui_main.c:659 src/skins/ui_main.c:663 -#, fuzzy msgid "mono" msgstr "モノラル" #: src/skins/ui_main.c:957 msgid "Can't jump to time when no track is being played.\n" -msgstr "" +msgstr "再生されるトラックがない時間へは移動できません.\n" #: src/skins/ui_main.c:972 src/skins/ui_manager.c:425 #: src/skins/ui_manager.c:426 -#, fuzzy msgid "Jump to Time" -msgstr "指定ファイルへ移動" +msgstr "指定した時間へ移動" #: src/skins/ui_main.c:993 -#, fuzzy msgid "minutes:seconds" -msgstr "分" +msgstr "分:秒" #: src/skins/ui_main.c:1003 -#, fuzzy msgid "Track length:" -msgstr "トラックのゲイン:" +msgstr "トラックの合計時間:" #: src/skins/ui_main.c:1149 msgid "Audacious - visibility warning" -msgstr "" +msgstr "Audacious - 可視警告" #: src/skins/ui_main.c:1152 -#, fuzzy msgid "Show main player window" -msgstr "ネットワークウィンドウの表示" +msgstr "メインウィンドウを表示する" #: src/skins/ui_main.c:1153 msgid "Ignore" -msgstr "" +msgstr "無視" #: src/skins/ui_main.c:1159 msgid "" @@ -4892,14 +4889,18 @@ "otherwise, you'll have to control it remotely via audtool or enabled plugins " "(such as the statusicon plugin)." msgstr "" +"Audacious はすべてのウィンドウが隠された状態で開始されました.\n" +"再度プレイヤウィンドウを表示するか,そのまま Audacious を操作するためには," +"audtool を用いるか statusicon のようなプラグインを有効にすることで遠隔操作し" +"てください." #: src/skins/ui_main.c:1165 msgid "Always ignore, show/hide is controlled remotely" -msgstr "" +msgstr "常に無視し,表示する/隠す は遠隔操作する" #: src/skins/ui_main.c:1210 msgid "Audacious - broken GTK engine usage warning" -msgstr "" +msgstr "Audacious - 壊れた GTK エンジンの使用警告" #: src/skins/ui_main.c:1218 #, c-format @@ -4914,69 +4915,75 @@ "\n" "To use these features, please consider using a different GTK theme engine." msgstr "" +"壊れた GTK エンジンが使われています\n" +"\n" +"Audacious は GTK エンジンが使われていることを検出しました.\n" +"\n" +"テーマエンジン %s は最近のスキンで用いられている特徴と非互換です.非互" +"換な特徴はこのセッションでは無効にされました.\n" +"\n" +"これらの特徴を用いるには, 他の GTK テーマエンジンを使うことを考慮してくださ" +"い." #: src/skins/ui_main.c:1229 msgid "Do not display this warning again" -msgstr "" +msgstr "次回からこの警告を表示しない" #: src/skins/ui_main.c:1253 msgid "Enter location to play:" -msgstr "" +msgstr "演奏する位置の入力:" #: src/skins/ui_main.c:1497 #, c-format msgid "Seek to: %d:%-2.2d/%d:%-2.2d (%d%%)" -msgstr "" +msgstr "移動先: %d:%-2.2d/%d:%-2.2d (%d%%)" #: src/skins/ui_main.c:1527 -#, fuzzy, c-format +#, c-format msgid "Volume: %d%%" -msgstr "音量: (%)" +msgstr "音量: %d%%" #: src/skins/ui_main.c:1555 #, c-format msgid "Balance: %d%% left" -msgstr "" +msgstr "バランス: %d%% 左" #: src/skins/ui_main.c:1559 msgid "Balance: center" -msgstr "" +msgstr "バランス: 中央" #: src/skins/ui_main.c:1563 #, c-format msgid "Balance: %d%% right" -msgstr "" +msgstr "バランス: %d%% 右" #: src/skins/ui_main.c:1881 -#, fuzzy msgid "Options Menu" -msgstr "オプション" +msgstr "オプションメニュー" #: src/skins/ui_main.c:1885 msgid "Disable 'Always On Top'" -msgstr "" +msgstr "「常に最前面に配置」無効" #: src/skins/ui_main.c:1887 msgid "Enable 'Always On Top'" -msgstr "" +msgstr "「常に最前面に配置」有効" #: src/skins/ui_main.c:1890 -#, fuzzy msgid "File Info Box" -msgstr "ファイル情報" +msgstr "ファイル情報ボックス" #: src/skins/ui_main.c:1894 msgid "Disable 'GUI Scaling'" -msgstr "" +msgstr "「GUI スケーリング」無効" #: src/skins/ui_main.c:1896 -#, fuzzy msgid "Enable 'GUI Scaling'" -msgstr "オーディオリサンプリングを有効にする" +msgstr "「GUI スケーリング」有効" #: src/skins/ui_main.c:1899 msgid "Visualization Menu" -msgstr "" +msgstr "視覚化メニュー" #: src/skins/ui_main.c:1946 msgid "" @@ -4987,65 +4994,68 @@ "2. No other programs is blocking the soundcard.\n" "3. Your soundcard is configured properly.\n" msgstr "" +"オーディオデバイスを開けませんでした.\n" +"\n" +"以下をチェックして下さい:\n" +"1. 現在選択している出力プラグインが正しいか.\n" +"2. お使いのサウンドカードをブロックしているアプリが他に存在しないか.\n" +"3. お使いのサウンドカードが正しく設定されているか.\n" #: src/skins/ui_manager.c:53 src/skins/ui_manager.c:54 msgid "Autoscroll Songname" -msgstr "" +msgstr "曲名の自動スクロール" #: src/skins/ui_manager.c:56 src/skins/ui_manager.c:57 msgid "Stop after Current Song" -msgstr "" +msgstr "現在の曲の後に停止する" #: src/skins/ui_manager.c:59 src/skins/ui_manager.c:60 -#, fuzzy msgid "Peaks" -msgstr "プランク" +msgstr "ピーク" #: src/skins/ui_manager.c:62 src/skins/ui_manager.c:63 -#, fuzzy msgid "Repeat" -msgstr "ビート" +msgstr "リピート" #: src/skins/ui_manager.c:65 src/skins/ui_manager.c:66 msgid "Shuffle" -msgstr "" +msgstr "シャッフル" #: src/skins/ui_manager.c:68 src/skins/ui_manager.c:69 msgid "No Playlist Advance" -msgstr "" +msgstr "次の曲に進まない" #: src/skins/ui_manager.c:71 src/skins/ui_manager.c:72 msgid "Show Player" -msgstr "" +msgstr "プレイヤを表示する" #: src/skins/ui_manager.c:74 src/skins/ui_manager.c:75 msgid "Show Playlist Editor" -msgstr "" +msgstr "プレイリストエディタを表示する" #: src/skins/ui_manager.c:77 src/skins/ui_manager.c:78 -#, fuzzy msgid "Show Equalizer" -msgstr "ウィンドウ->イコライザー" +msgstr "イコライザを表示する" #: src/skins/ui_manager.c:80 src/skins/ui_manager.c:81 msgid "Always on Top" -msgstr "" +msgstr "常に最前面に配置する" #: src/skins/ui_manager.c:83 src/skins/ui_manager.c:84 msgid "Put on All Workspaces" -msgstr "" +msgstr "全ワークスペースに配置する" #: src/skins/ui_manager.c:86 src/skins/ui_manager.c:87 msgid "Roll up Player" -msgstr "" +msgstr "プレイヤを巻き上げる" #: src/skins/ui_manager.c:89 src/skins/ui_manager.c:90 msgid "Roll up Playlist Editor" -msgstr "" +msgstr "プレイリストエディタを巻き上げる" #: src/skins/ui_manager.c:92 src/skins/ui_manager.c:93 msgid "Roll up Equalizer" -msgstr "" +msgstr "イコライザを巻き上げる" #: src/skins/ui_manager.c:95 src/sndstretch/sndstretch_xmms.c:375 msgid "Scale" @@ -5053,537 +5063,489 @@ #: src/skins/ui_manager.c:96 msgid "DoubleSize" -msgstr "" +msgstr "ダブルサイズ" #: src/skins/ui_manager.c:98 src/skins/ui_manager.c:99 msgid "Easy Move" -msgstr "" +msgstr "簡単移動" #: src/skins/ui_manager.c:107 -#, fuzzy msgid "Analyzer" -msgstr "スペクトラムアナライザ" +msgstr "アナライザ" #: src/skins/ui_manager.c:108 -#, fuzzy msgid "Scope" -msgstr "演奏停止" +msgstr "スコープ" #: src/skins/ui_manager.c:109 msgid "Voiceprint" -msgstr "" +msgstr "声紋" #: src/skins/ui_manager.c:110 msgid "Off" -msgstr "" +msgstr "オフ" #: src/skins/ui_manager.c:114 src/skins/ui_manager.c:131 #: src/skins/ui_manager.c:137 -#, fuzzy msgid "Normal" -msgstr "フォーマット" +msgstr "標準" #: src/skins/ui_manager.c:115 src/skins/ui_manager.c:132 -#, fuzzy msgid "Fire" -msgstr "サティア" +msgstr "ファイア" #: src/skins/ui_manager.c:116 msgid "Vertical Lines" -msgstr "" +msgstr "垂直ライン" #: src/skins/ui_manager.c:120 -#, fuzzy msgid "Lines" -msgstr "分" +msgstr "ライン" #: src/skins/ui_manager.c:121 -#, fuzzy msgid "Bars" -msgstr "ベース" +msgstr "バー" #: src/skins/ui_manager.c:125 -#, fuzzy msgid "Dot Scope" -msgstr "ループしない" +msgstr "ドット" #: src/skins/ui_manager.c:126 msgid "Line Scope" -msgstr "" +msgstr "ライン" #: src/skins/ui_manager.c:127 msgid "Solid Scope" -msgstr "" +msgstr "ソリッド" #: src/skins/ui_manager.c:133 msgid "Ice" -msgstr "" +msgstr "アイス" #: src/skins/ui_manager.c:138 msgid "Smooth" -msgstr "" +msgstr "スムーズ" #: src/skins/ui_manager.c:142 msgid "Full (~50 fps)" -msgstr "" +msgstr "1:1 (〜50 fps)" #: src/skins/ui_manager.c:143 msgid "Half (~25 fps)" -msgstr "" +msgstr "1:2 (〜25 fps)" #: src/skins/ui_manager.c:144 msgid "Quarter (~13 fps)" -msgstr "" +msgstr "1:4 (〜13 fps)" #: src/skins/ui_manager.c:145 msgid "Eighth (~6 fps)" -msgstr "" +msgstr "1:8 (〜6 fps)" #: src/skins/ui_manager.c:149 src/skins/ui_manager.c:157 -#, fuzzy msgid "Slowest" -msgstr "ショーチューン" +msgstr "最も遅い" #: src/skins/ui_manager.c:150 src/skins/ui_manager.c:158 -#, fuzzy msgid "Slow" -msgstr "低" +msgstr "遅い" #: src/skins/ui_manager.c:151 src/skins/ui_manager.c:159 -#, fuzzy msgid "Medium" msgstr "中" #: src/skins/ui_manager.c:152 src/skins/ui_manager.c:160 -#, fuzzy msgid "Fast" -msgstr "フォーマット" +msgstr "早い" #: src/skins/ui_manager.c:153 src/skins/ui_manager.c:161 msgid "Fastest" -msgstr "" +msgstr "最も早い" #: src/skins/ui_manager.c:165 msgid "Time Elapsed" -msgstr "" +msgstr "経過時間を表示する" #: src/skins/ui_manager.c:166 msgid "Time Remaining" -msgstr "" +msgstr "残り時間を表示する" #: src/skins/ui_manager.c:180 src/skins/ui_manager.c:181 -#, fuzzy msgid "Pause" -msgstr "演奏停止" +msgstr "一時停止" #: src/skins/ui_manager.c:186 src/skins/ui_manager.c:187 -#, fuzzy msgid "Previous" -msgstr "前のトラック" +msgstr "前の曲" #: src/skins/ui_manager.c:189 src/skins/ui_manager.c:190 -#, fuzzy msgid "Next" -msgstr "文字" +msgstr "次の曲" #: src/skins/ui_manager.c:195 -#, fuzzy msgid "Visualization" -msgstr "組織:" +msgstr "視覚化" #: src/skins/ui_manager.c:196 msgid "Visualization Mode" -msgstr "" +msgstr "視覚化モード" #: src/skins/ui_manager.c:197 msgid "Analyzer Mode" -msgstr "" +msgstr "アナライザモード" #: src/skins/ui_manager.c:198 msgid "Scope Mode" -msgstr "" +msgstr "スコープモード" #: src/skins/ui_manager.c:199 msgid "Voiceprint Mode" -msgstr "" +msgstr "声紋モード" #: src/skins/ui_manager.c:200 msgid "WindowShade VU Mode" -msgstr "" +msgstr "WindowShade VU モード" #: src/skins/ui_manager.c:201 msgid "Refresh Rate" -msgstr "" +msgstr "リフレッシュレート" #: src/skins/ui_manager.c:202 msgid "Analyzer Falloff" -msgstr "" +msgstr "アナライザ フォールオフ" #: src/skins/ui_manager.c:203 msgid "Peaks Falloff" -msgstr "" +msgstr "ピーク フォールオフ" #: src/skins/ui_manager.c:208 -#, fuzzy msgid "Playlist" -msgstr "プレイリストの選択" +msgstr "プレイリスト" #: src/skins/ui_manager.c:210 src/skins/ui_manager.c:211 -#, fuzzy msgid "New Playlist" -msgstr "プレイリストの選択" +msgstr "新しいプレイリスト" #: src/skins/ui_manager.c:213 src/skins/ui_manager.c:214 -#, fuzzy msgid "Select Next Playlist" -msgstr "プレイリストの選択" +msgstr "次のプレイリストを選択" #: src/skins/ui_manager.c:216 src/skins/ui_manager.c:217 -#, fuzzy msgid "Select Previous Playlist" -msgstr "プレイリストの選択" +msgstr "前のプレイリストを選択" #: src/skins/ui_manager.c:219 src/skins/ui_manager.c:220 -#, fuzzy msgid "Delete Playlist" -msgstr "プレイリストの選択" +msgstr "プレイリストの削除" #: src/skins/ui_manager.c:222 -#, fuzzy msgid "Load List" -msgstr "読み込み" +msgstr "プレイリストの読み込み" #: src/skins/ui_manager.c:223 msgid "Loads a playlist file into the selected playlist." -msgstr "" +msgstr "選択したプレイリストにプレイリストファイルを読み込みます." #: src/skins/ui_manager.c:225 -#, fuzzy msgid "Save List" -msgstr "保存" +msgstr "プレイリストの保存" #: src/skins/ui_manager.c:226 -#, fuzzy msgid "Saves the selected playlist." -msgstr "プレイリストの選択" +msgstr "選択したプレイリストを保存します." #: src/skins/ui_manager.c:228 -#, fuzzy msgid "Save Default List" -msgstr "デフォルト (%s)" +msgstr "デフォルトのプレイリストの保存" #: src/skins/ui_manager.c:229 msgid "Saves the selected playlist to the default location." -msgstr "" +msgstr "選択したプレイリストをデフォルト位置に保存します." #: src/skins/ui_manager.c:232 msgid "Refresh List" -msgstr "" +msgstr "プレイリストの更新" #: src/skins/ui_manager.c:233 msgid "Refreshes metadata associated with a playlist entry." -msgstr "" +msgstr "プレイリストのエントリに関連付けられたメタデータを更新します." #: src/skins/ui_manager.c:236 msgid "List Manager" -msgstr "" +msgstr "プレイリストマネージャ" #: src/skins/ui_manager.c:237 msgid "Opens the playlist manager." -msgstr "" +msgstr "プレイリストマネージャを開きます." #: src/skins/ui_manager.c:243 msgid "View" -msgstr "" +msgstr "表示" #: src/skins/ui_manager.c:247 msgid "Add Internet Address..." -msgstr "" +msgstr "インターネットアドレスの追加..." #: src/skins/ui_manager.c:248 msgid "Adds a remote track to the playlist." -msgstr "" +msgstr "リモートトラックをプレイリストに追加します." #: src/skins/ui_manager.c:251 msgid "Add Files..." -msgstr "" +msgstr "ファイルの追加..." #: src/skins/ui_manager.c:252 -#, fuzzy msgid "Adds files to the playlist." -msgstr "サブチューンをプレイリストに追加" +msgstr "ファイルをプレイリストに追加します." #: src/skins/ui_manager.c:257 msgid "Search and Select" -msgstr "" +msgstr "検索と選択" #: src/skins/ui_manager.c:258 msgid "" "Searches the playlist and selects playlist entries based on specific " "criteria." -msgstr "" +msgstr "プレイリストを検索し, 特定の判定基準に基いて選択します." #: src/skins/ui_manager.c:261 -#, fuzzy msgid "Invert Selection" -msgstr "フォーマット選択" +msgstr "選択範囲の反転" #: src/skins/ui_manager.c:262 msgid "Inverts the selected and unselected entries." -msgstr "" +msgstr "エントリの選択と未選択を反転します." #: src/skins/ui_manager.c:265 -#, fuzzy msgid "Select All" -msgstr "プレイリストの選択" +msgstr "全て選択" #: src/skins/ui_manager.c:266 msgid "Selects all of the playlist entries." -msgstr "" +msgstr "プレイリストの全てのエントリを選択します." #: src/skins/ui_manager.c:269 -#, fuzzy msgid "Select None" -msgstr "スキンファイル選択" +msgstr "未選択にする" #: src/skins/ui_manager.c:270 msgid "Deselects all of the playlist entries." -msgstr "" +msgstr "プレイリストの全てのエントリを未選択にします." #: src/skins/ui_manager.c:275 -#, fuzzy msgid "Remove All" -msgstr "削除" +msgstr "全て削除" #: src/skins/ui_manager.c:276 msgid "Removes all entries from the playlist." -msgstr "" +msgstr "全てのエントリをプレイリストから削除します." #: src/skins/ui_manager.c:279 msgid "Clear Queue" -msgstr "" +msgstr "キューのクリア" #: src/skins/ui_manager.c:280 msgid "Clears the queue associated with this playlist." -msgstr "" +msgstr "プレイリストに関連付けられたキューをクリアします." #: src/skins/ui_manager.c:283 msgid "Remove Unavailable Files" -msgstr "" +msgstr "利用不可ファイルの削除" #: src/skins/ui_manager.c:284 msgid "Removes unavailable files from the playlist." -msgstr "" +msgstr "利用不可ファイルをプレイリストから削除します." #: src/skins/ui_manager.c:287 -#, fuzzy msgid "Remove Duplicates" -msgstr "ドライブの削除" +msgstr "重複エントリの削除" #: src/skins/ui_manager.c:289 src/skins/ui_manager.c:321 #: src/skins/ui_manager.c:351 -#, fuzzy msgid "By Title" msgstr "タイトル" #: src/skins/ui_manager.c:290 msgid "Removes duplicate entries from the playlist by title." -msgstr "" +msgstr "重複するタイトルのエントリをプレイリストから削除します." #: src/skins/ui_manager.c:293 src/skins/ui_manager.c:329 #: src/skins/ui_manager.c:359 -#, fuzzy msgid "By Filename" msgstr "ファイル名" #: src/skins/ui_manager.c:294 msgid "Removes duplicate entries from the playlist by filename." -msgstr "" +msgstr "重複するファイル名のエントリをプレイリストから削除します." #: src/skins/ui_manager.c:297 src/skins/ui_manager.c:333 #: src/skins/ui_manager.c:363 -#, fuzzy msgid "By Path + Filename" -msgstr "ファイル名" +msgstr "パス名とファイル名" #: src/skins/ui_manager.c:298 msgid "Removes duplicate entries from the playlist by their full path." -msgstr "" +msgstr "重複するパス名とファイル名のエントリをプレイリストから削除します." #: src/skins/ui_manager.c:301 msgid "Remove Unselected" -msgstr "" +msgstr "選択していないエントリの削除" #: src/skins/ui_manager.c:302 msgid "Remove unselected entries from the playlist." -msgstr "" +msgstr "選択していないエントリをプレイリストから削除します." #: src/skins/ui_manager.c:305 msgid "Remove Selected" -msgstr "" +msgstr "選択したエントリの削除" #: src/skins/ui_manager.c:306 msgid "Remove selected entries from the playlist." -msgstr "" +msgstr "選択したエントリをプレイリストから削除します." #: src/skins/ui_manager.c:311 msgid "Randomize List" -msgstr "" +msgstr "プレイリストをランダムにする" #: src/skins/ui_manager.c:312 msgid "Randomizes the playlist." -msgstr "" +msgstr "プレイリストの順序をランダムにします." #: src/skins/ui_manager.c:315 msgid "Reverse List" -msgstr "" +msgstr "プレイリストを逆順にする" #: src/skins/ui_manager.c:316 msgid "Reverses the playlist." -msgstr "" +msgstr "プレイリストの順序を逆順にします." #: src/skins/ui_manager.c:319 -#, fuzzy msgid "Sort List" -msgstr "アーティスト:" +msgstr "プレイリストのソート" #: src/skins/ui_manager.c:322 src/skins/ui_manager.c:352 msgid "Sorts the list by title." -msgstr "" +msgstr "タイトル順でプレイリストをソートします." #: src/skins/ui_manager.c:325 src/skins/ui_manager.c:355 -#, fuzzy msgid "By Artist" -msgstr "アーティスト:" +msgstr "アーティスト" #: src/skins/ui_manager.c:326 src/skins/ui_manager.c:356 msgid "Sorts the list by artist." -msgstr "" +msgstr "アーティスト順でプレイリストをソートします." #: src/skins/ui_manager.c:330 src/skins/ui_manager.c:360 msgid "Sorts the list by filename." -msgstr "" +msgstr "ファイル名順でプレイリストをソートします." #: src/skins/ui_manager.c:334 src/skins/ui_manager.c:364 msgid "Sorts the list by full pathname." -msgstr "" +msgstr "ファイルのパス名でプレイリストをソートします." #: src/skins/ui_manager.c:337 src/skins/ui_manager.c:367 -#, fuzzy msgid "By Date" -msgstr "日付:" +msgstr "日付" #: src/skins/ui_manager.c:338 src/skins/ui_manager.c:368 msgid "Sorts the list by modification time." -msgstr "" +msgstr "変更時間でプレイリストをソートします." #: src/skins/ui_manager.c:341 src/skins/ui_manager.c:371 -#, fuzzy msgid "By Track Number" -msgstr "トラック番号:" +msgstr "トラック番号" #: src/skins/ui_manager.c:342 src/skins/ui_manager.c:372 msgid "Sorts the list by track number." -msgstr "" +msgstr "トラック番号順でプレイリストをソートします." #: src/skins/ui_manager.c:345 src/skins/ui_manager.c:375 -#, fuzzy msgid "By Playlist Entry" -msgstr "高速なプレイリスト情報" +msgstr "プレイリストのエントリ" #: src/skins/ui_manager.c:346 src/skins/ui_manager.c:376 msgid "Sorts the list by playlist entry." -msgstr "" +msgstr "プレイリストのエントリ順でソートします." #: src/skins/ui_manager.c:349 -#, fuzzy msgid "Sort Selected" -msgstr "フォーマット選択" +msgstr "選択範囲のソート" #: src/skins/ui_manager.c:385 -#, fuzzy msgid "File" -msgstr "フィルタ" +msgstr "ファイル" #: src/skins/ui_manager.c:388 msgid "Plugin Services" -msgstr "" +msgstr "プラグインサービス" #: src/skins/ui_manager.c:390 src/skins/ui_manager.c:393 -#, fuzzy msgid "View Track Details" -msgstr "トラックゲインを使用する" +msgstr "トラックの詳細" #: src/skins/ui_manager.c:391 src/skins/ui_manager.c:394 msgid "View track details" -msgstr "" +msgstr "トラックの詳細" #: src/skins/ui_manager.c:396 src/skins/ui_manager.c:397 -#, fuzzy msgid "About Audacious" -msgstr "LIRC Audacious プラグインについて" +msgstr "Audacious について" #: src/skins/ui_manager.c:399 -#, fuzzy msgid "Play File" -msgstr "演奏時間:" +msgstr "ファイルを演奏" #: src/skins/ui_manager.c:400 -#, fuzzy msgid "Load and play a file" -msgstr "プレイヤ起動時に SF を読み込む" +msgstr "ファイルを読み込んで演奏" #: src/skins/ui_manager.c:402 -#, fuzzy msgid "Play Location" -msgstr "場所:" +msgstr "場所を演奏" #: src/skins/ui_manager.c:403 -#, fuzzy msgid "Play media from the selected location" -msgstr "選択されたアクションの確認" +msgstr "選択した場所からメディアを演奏" #: src/skins/ui_manager.c:405 msgid "Plugin services" -msgstr "" +msgstr "プラグインサービス" #: src/skins/ui_manager.c:407 msgid "Preferences" -msgstr "" +msgstr "設定" #: src/skins/ui_manager.c:408 msgid "Open preferences window" -msgstr "" +msgstr "設定ウィンドウを開く" #: src/skins/ui_manager.c:410 -#, fuzzy msgid "_Quit" -msgstr "品質" +msgstr "終了(_Q)" #: src/skins/ui_manager.c:411 -#, fuzzy msgid "Quit Audacious" -msgstr "%s - Audacious" +msgstr "Audacious を終了する" #: src/skins/ui_manager.c:413 src/skins/ui_manager.c:414 msgid "Set A-B" -msgstr "" +msgstr "A-B をセット" #: src/skins/ui_manager.c:416 src/skins/ui_manager.c:417 msgid "Clear A-B" -msgstr "" +msgstr "A-B をクリア" #: src/skins/ui_manager.c:419 src/skins/ui_manager.c:420 msgid "Jump to Playlist Start" -msgstr "" +msgstr "最初の曲へ移動" #: src/skins/ui_manager.c:428 msgid "Queue Toggle" -msgstr "" +msgstr "キューを切り替える" #: src/skins/ui_manager.c:429 msgid "Enables/disables the entry in the playlist's queue." -msgstr "" +msgstr "プレイリストのキューに入っているエントリの有効/無効を切り替えます." #: src/skins/ui_manager.c:436 msgid "Load" @@ -5591,105 +5553,97 @@ #: src/skins/ui_manager.c:441 src/skins/ui_manager.c:462 #: src/skins/ui_manager.c:477 -#, fuzzy msgid "Preset" -msgstr "ポート" +msgstr "プリセット" #: src/skins/ui_manager.c:442 msgid "Load preset" -msgstr "" +msgstr "プリセットの読み込み" #: src/skins/ui_manager.c:444 src/skins/ui_manager.c:465 #: src/skins/ui_manager.c:480 msgid "Auto-load preset" -msgstr "" +msgstr "自動読み込みのプリセット" #: src/skins/ui_manager.c:445 msgid "Load auto-load preset" -msgstr "" +msgstr "自動読み込みのプリセット" #: src/skins/ui_manager.c:448 -#, fuzzy msgid "Load default preset into equalizer" -msgstr "デフォルト値を読み込む" +msgstr "イコライザにデフォルトプリセットを読み込む" #: src/skins/ui_manager.c:450 -#, fuzzy msgid "Zero" -msgstr "レトロ" +msgstr "ゼロ" #: src/skins/ui_manager.c:451 msgid "Set equalizer preset levels to zero" -msgstr "" +msgstr "イコライザプリセットレベルをゼロにセット" #: src/skins/ui_manager.c:453 -#, fuzzy msgid "From file" -msgstr "プロファイル: %s" +msgstr "ファイル" #: src/skins/ui_manager.c:454 -#, fuzzy msgid "Load preset from file" -msgstr "ファイルから読み込めません\n" +msgstr "ファイルからプリセットを読み込み" #: src/skins/ui_manager.c:456 msgid "From WinAMP EQF file" -msgstr "" +msgstr "WinAMP EQF ファイル" #: src/skins/ui_manager.c:457 msgid "Load preset from WinAMP EQF file" -msgstr "" +msgstr "WinAMP EQF ファイルからプリセットを読み込み" #: src/skins/ui_manager.c:459 msgid "WinAMP Presets" -msgstr "" +msgstr "WinAMP プリセット" #: src/skins/ui_manager.c:460 msgid "Import WinAMP presets" -msgstr "" +msgstr "WinAMP プリセット" #: src/skins/ui_manager.c:463 msgid "Save preset" -msgstr "" +msgstr "プリセットの保存" #: src/skins/ui_manager.c:466 msgid "Save auto-load preset" -msgstr "" +msgstr "自動読み込みのプリセットの保存" #: src/skins/ui_manager.c:469 -#, fuzzy msgid "Save default preset" -msgstr "デフォルト値を読み込む" +msgstr "デフォルトプリセットの保存" #: src/skins/ui_manager.c:471 -#, fuzzy msgid "To file" -msgstr "STIL ファイル:" +msgstr "ファイル" #: src/skins/ui_manager.c:472 msgid "Save preset to file" -msgstr "" +msgstr "プリセットをファイルへ保存" #: src/skins/ui_manager.c:474 msgid "To WinAMP EQF file" -msgstr "" +msgstr "WinAMP EQF ファイル" #: src/skins/ui_manager.c:475 msgid "Save preset to WinAMP EQF file" -msgstr "" +msgstr "プリセットを WinAMP EQF ファイルへ保存" #: src/skins/ui_manager.c:478 -#, fuzzy msgid "Delete preset" -msgstr "削除" +msgstr "プリセットの削除" #: src/skins/ui_manager.c:481 msgid "Delete auto-load preset" -msgstr "" +msgstr "自動読み込みのプリセットの削除" #: src/skins/ui_playlist.c:454 msgid "Search entries in active playlist" -msgstr "" +msgstr "有効になっているプレイリストのエントリを検索" #: src/skins/ui_playlist.c:462 msgid "" @@ -5698,43 +5652,43 @@ "expressions work, simply insert a literal portion of what you're searching " "for." msgstr "" +"1つ以上の項目を埋めることによって, プレイリストのエントリを選択します. 項目は" +"正規表現が使え, 大文字と小文字を区別しません. 正規表現がどのように動作するか" +"わからない場合は, 単純に検索しようとしているものの文字を入力します." #: src/skins/ui_playlist.c:477 -#, fuzzy msgid "Album: " -msgstr "アルバム名:" +msgstr "アルバム名: " #: src/skins/ui_playlist.c:484 -#, fuzzy msgid "Artist: " -msgstr "アーティスト:" +msgstr "アーティスト: " #: src/skins/ui_playlist.c:491 -#, fuzzy msgid "Filename: " -msgstr "ファイル名:" +msgstr "ファイル名: " #: src/skins/ui_playlist.c:499 msgid "Clear previous selection before searching" -msgstr "" +msgstr "検索前に以前の選択をクリア" #: src/skins/ui_playlist.c:502 msgid "Automatically toggle queue for matching entries" -msgstr "" +msgstr "マッチしたエントリのキューを自動的にトグル" #: src/skins/ui_playlist.c:505 msgid "Create a new playlist with matching entries" -msgstr "" +msgstr "マッチしたエントリで新しいプレイリストを作成" #: src/skins/ui_playlist.c:724 #, c-format msgid "Error writing playlist \"%s\": %s" -msgstr "" +msgstr "プレイリスト \"%s\" を書き込む際にエラー: %s" #: src/skins/ui_playlist.c:746 #, c-format msgid "%s already exist. Continue?" -msgstr "" +msgstr "%s は既に存在しています. 続行しますか?" #: src/skins/ui_playlist.c:761 #, c-format @@ -5743,88 +5697,86 @@ "\n" "Unknown file type for '%s'.\n" msgstr "" +"プレイリストを保存できません!\n" +"\n" +"%s のファイルの種類が不明です.\n" #: src/skins/ui_playlist.c:887 -#, fuzzy msgid "Save as Static Playlist" -msgstr "プレイリストの選択" +msgstr "スタティックプレイリストとして保存" #: src/skins/ui_playlist.c:894 msgid "Use Relative Path" -msgstr "" +msgstr "相対パスを使う" #: src/skins/ui_playlist.c:916 -#, fuzzy msgid "Load Playlist" -msgstr "高速なプレイリスト情報" +msgstr "プレイリストの読み込み" #: src/skins/ui_playlist.c:929 -#, fuzzy msgid "Save Playlist" -msgstr "プレイリストの選択" +msgstr "プレイリストの保存" #: src/skins/ui_playlist.c:1497 -#, fuzzy msgid "Audacious Playlist Editor" -msgstr "高速なプレイリスト情報" +msgstr "Audacious プレイリストエディタ" #: src/skins/ui_skinned_equalizer_slider.c:377 msgid "PREAMP" -msgstr "" +msgstr "プリアンプ" #: src/skins/ui_skinned_equalizer_slider.c:377 msgid "60HZ" -msgstr "" +msgstr "60HZ" #: src/skins/ui_skinned_equalizer_slider.c:377 msgid "170HZ" -msgstr "" +msgstr "170HZ" #: src/skins/ui_skinned_equalizer_slider.c:378 msgid "310HZ" -msgstr "" +msgstr "310HZ" #: src/skins/ui_skinned_equalizer_slider.c:378 -#, fuzzy msgid "600HZ" -msgstr "11000 Hz" +msgstr "600HZ" #: src/skins/ui_skinned_equalizer_slider.c:378 msgid "1KHZ" -msgstr "" +msgstr "1KHZ" #: src/skins/ui_skinned_equalizer_slider.c:379 msgid "3KHZ" -msgstr "" +msgstr "3KHZ" #: src/skins/ui_skinned_equalizer_slider.c:379 msgid "6KHZ" -msgstr "" +msgstr "6KHZ" #: src/skins/ui_skinned_equalizer_slider.c:379 msgid "12KHZ" -msgstr "" +msgstr "12KHZ" #: src/skins/ui_skinned_equalizer_slider.c:380 msgid "14KHZ" -msgstr "" +msgstr "14KHZ" #: src/skins/ui_skinned_equalizer_slider.c:380 msgid "16KHZ" -msgstr "" +msgstr "16KHZ" #: src/skins/ui_skinselector.c:178 msgid "Archived Winamp 2.x skin" -msgstr "" +msgstr "Archived Winamp 2.x スキン" #: src/skins/ui_skinselector.c:183 msgid "Unarchived Winamp 2.x skin" -msgstr "" +msgstr "Unarchived Winamp 2.x スキン" #: src/skins/util.c:1132 -#, fuzzy, c-format +#, c-format msgid "Could not create directory (%s): %s\n" -msgstr "sidFilename ('%s') を割り当てられませんでした\n" +msgstr "ディレクトリ (%s) を作成できませんでした: %s\n" #: src/sndfile/plugin.c:554 msgid "About sndfile plugin" @@ -6387,1428 +6339,3 @@ "ru>) の\n" "Tony Vroon による Audacious への適用.\n" "このプラグインは以下のソースコードを元とする: " - -#~ msgid "Descriptions of SID-specific Tuplez fields go here. :D" -#~ msgstr "SID 特有のタプルフィールドはここに記載されます.:D" - -#~ msgid "Error initializing song-length database!\n" -#~ msgstr "曲の長さデータベース初期化エラー!\n" - -#~ msgid "Error initializing STIL database!\n" -#~ msgstr "STIL データベース初期化エラー!\n" - -#~ msgid "Couldn't allocate memory for audio data buffer!\n" -#~ msgstr "オーディオデータバッファのメモリを割り当てられませんでした!\n" - -#~ msgid "Couldn't allocate memory for audio oversampling buffer!\n" -#~ msgstr "オーバーサンプリングバッファのメモリを割り当てられませんでした!\n" - -#~ msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n" -#~ msgstr "SID-tune '%s' (サブチューン #%i)を初期化できませんでした!\n" - -#~ msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n" -#~ msgstr "" -#~ "XMMS オーディオ出力 (fmt=%x, freq=%i, nchan=%i) を開けませんでした!\n" - -#~ msgid "Oversampling rate-conversion pass failed.\n" -#~ msgstr "オーバーサンプリングレート変換パスに失敗しました.\n" - -#~ msgid "Allocation of sid2FilterPresets structure failed!\n" -#~ msgstr "sid2FilterPresets 構造体の割り当てに失敗しました!\n" - -#~ msgid "Warning: Could not set filter curve widget points!\n" -#~ msgstr "警告: フィルタ曲線の分点がセットできませんでした!\n" - -#~ msgid "Error allocating new node. Fatal error.\n" -#~ msgstr "新しいノードの割り当てに失敗. 致命的エラー.\n" - -#~ msgid "'=' expected on column #%d.\n" -#~ msgstr "'=' は #%d 列にあることを期待されます.\n" - -#~ msgid "Could not allocate memory for node.\n" -#~ msgstr "ノードにメモリを割り当てられませんでした.\n" - -#~ msgid "Could not open SongLengthDB '%s'\n" -#~ msgstr "曲の長さ DB '%s' を開けませんでした.\n" - -#~ msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n" -#~ msgstr "曲の長さ DB ファイル '%s' の #%d 行の MD5 ハッシュが無効です!\n" - -#~ msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n" -#~ msgstr "曲の長さ DB ファイル '%s' の #%d 行のエントリが無効です!\n" - -#~ msgid "Invalid line in SongLengthDB file '%s' line #%d\n" -#~ msgstr "曲の長さ DB ファイル '%s' の #%d 行が無効です!\n" - -#~ msgid "Not a PSID or RSID file '%s'\n" -#~ msgstr "ファイル '%s' は PSID でも RSID でもありません.\n" - -#~ msgid "Error reading SID file header from '%s'\n" -#~ msgstr "'%s' からの SID ファイルヘッダ読み込みでエラーが発生しました.\n" - -#~ msgid "Error allocating temp data buffer for file '%s'\n" -#~ msgstr "" -#~ "ファイル '%s' の一時データバッファの割り当てでエラーが発生しました.\n" - -#~ msgid "[SIDPlay1] Could not initialize emulation engine.\n" -#~ msgstr "[SIDPlay1] エミュレーションエンジンを初期化できませんでした.\n" - -#~ msgid "[SIDPlay1] Endianess verification failed.\n" -#~ msgstr "[SIDPlay1] エンディアンの検証に失敗しました.\n" - -#~ msgid "[SIDPlay1] Emulator engine configuration failed!\n" -#~ msgstr "[SIDPlay1] エミュレータエンジンの設定に失敗しました!\n" - -#~ msgid "[SIDPlay1] Could not initialize SIDTune object.\n" -#~ msgstr "[SIDPlay1] SIDTune オブジェクトを初期化できませんでした.\n" - -#~ msgid "" -#~ "[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, " -#~ "report to XMMS-SID author.\n" -#~ msgstr "" -#~ "[SIDPlay1] SID-tune 構造体ポインタが NULL でした. これは発生しないはずなの" -#~ "で, XMMS-SID 作者に報告してください.\n" - -#~ msgid "" -#~ "[SIDPlay1] SID-tune status check failed. This should not happen, report " -#~ "to XMMS-SID author.\n" -#~ msgstr "" -#~ "[SIDPlay1] SID-tune 状態確認に失敗しました. これは発生しないはずなので, " -#~ "XMMS-SID 作者に報告してください.\n" - -#~ msgid "[SIDPlay2] Could not initialize emulation engine.\n" -#~ msgstr "[SIDPlay2] エミュレーションエンジンを初期化できませんでした.\n" - -#~ msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n" -#~ msgstr "[SIDPlay2] フィルタ曲線の分点の数が不正です (%d > %d)\n" - -#~ msgid "reSID->create() failed.\n" -#~ msgstr "reSID->create() に失敗しました.\n" - -#~ msgid "reSID->filter(%d) failed.\n" -#~ msgstr "reSID->filter(%d) に失敗しました.\n" - -#~ msgid "reSID->sampling(%d) failed.\n" -#~ msgstr "reSID->sampling(%d) に失敗しました.\n" - -#~ msgid "reSID->filter(NULL) failed.\n" -#~ msgstr "reSID->filter(NULL) に失敗しました.\n" - -#~ msgid "hardSID->create() failed.\n" -#~ msgstr "hardSID->create() に失敗しました.\n" - -#~ msgid "hardSID->filter(%d) failed.\n" -#~ msgstr "hardSID->filter(%d) に失敗しました.\n" - -#~ msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n" -#~ msgstr "[SIDPlay2] SIDBuilder オブジェクトを初期化できませんでした.\n" - -#~ msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n" -#~ msgstr "[SIDPlay2] clockSpeed=%d は無効です. PAL にフォールバックします.\n" - -#~ msgid "Invalid sid2OptLevel=%d, falling back to %d.\n" -#~ msgstr "sid2OptLevel %d は無効です. %d にフォールバックします.\n" - -#~ msgid "[SIDPlay2] Emulator engine configuration failed!\n" -#~ msgstr "[SIDPlay2] エミュレーションエンジンの設定に失敗しました!\n" - -#~ msgid "[SIDPlay2] Could not initialize SIDTune object.\n" -#~ msgstr "[SIDPlay2] SIDTune オブジェクトを初期化できませんでした.\n" - -#~ msgid "[SIDPlay2] currTune->selectSong() failed\n" -#~ msgstr "[SIDPlay2] currTune->selectSong() に失敗しました.\n" - -#~ msgid "[SIDPlay2] currEng->load() failed\n" -#~ msgstr "[SIDPlay2] currEng->load() に失敗しました.\n" - -#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n" -#~ msgstr "t_xs_tuneinfo ('%s') のメモリを割り当てられませんでした\n" - -#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n" -#~ msgstr "t_xs_subtuneinfo ('%s', %i) のメモリを割り当てられませんでした\n" - -#~ msgid "SubTune pointer structure realloc failed.\n" -#~ msgstr "SubTune ポインタ構造体の realloc に失敗しました.\n" - -#~ msgid "SubTune structure malloc failed!\n" -#~ msgstr "SubTune 構造体の malloc に失敗しました!\n" - -#~ msgid "Could not open STILDB '%s'\n" -#~ msgstr "STILDB '%s' を開けませんでした.\n" - -#~ msgid "Dither output when rounding to 16-bit" -#~ msgstr "16ビットに丸めるとき出力をディザリングする" - -#~ msgid "Base gain (dB):" -#~ msgstr "基本ゲイン (dB):" - -#~ msgid "Enable ReplayGain processing" -#~ msgstr "リプレイゲイン処理を有効にする" - -#~ msgid "Pre-gain with RG info (dB):" -#~ msgstr "リプレイゲイン情報ありのプリゲイン (dB):" - -#~ msgid "Pre-gain without RG info (dB):" -#~ msgstr "リプレイゲイン情報なしのプリゲイン (dB):" - -#~ msgid "Enable peak info clip prevention" -#~ msgstr "クリッピング防止のためにピーク情報を有効にする" - -#~ msgid "Enable adaptive scaler clip prevention" -#~ msgstr "クリッピング防止に適応したスケーラを有効にする" - -#~ msgid "Gain Control" -#~ msgstr "ゲインコントロール" - -#~ msgid "Enable 6dB Boost + Hard Limiting" -#~ msgstr "6dB ブースト + ハードリミットを有効にする" - -#~ msgid "Playback:" -#~ msgstr "演奏:" - -#~ msgid "Configure keys which controls Audacious playback." -#~ msgstr "Audacious の演奏を制御するキーを設定します." - -#~ msgid "Volume Control:" -#~ msgstr "音量コントロール:" - -#~ msgid "Configure keys which controls music volume." -#~ msgstr "曲の音量をコントロールするキーを設定します." - -#~ msgid "Player:" -#~ msgstr "プレイヤ:" - -#~ msgid "Configure keys which control the player." -#~ msgstr "プレイヤをコントロールするキーを設定します." - -#~ msgid "For this, the Audacious OSD plugin must be activated." -#~ msgstr "Audacious OSD プラグインを有効にしなければ,利用できません." - -#~ msgid "Track mode" -#~ msgstr "トラックモード" - -#~ msgid "6dB hard limiting" -#~ msgstr "6dB ハードリミット" - -#~ msgid "Preamp (dB):" -#~ msgstr "プリアンプ (dB):" - -#~ msgid "About sndfile WAV support" -#~ msgstr "sndfile WAV サポートについて" - -#~ msgid "Play/Pause:" -#~ msgstr "演奏/一時停止:" - -#~ msgid "Couldn't open file!" -#~ msgstr "ファイルを開けませんでした!" - -#~ msgid "Couldn't write tag!" -#~ msgstr "タグを書き込めませんでした!" - -#~ msgid "Name:" -#~ msgstr "名前:" - -#~ msgid " MPEG Info " -#~ msgstr " MPEG 情報 " - -#~ msgid " ID3 Tag " -#~ msgstr " ID3 タグ " - -#~ msgid "Unknown" -#~ msgstr "不明" - -#~ msgid "Layer %s" -#~ msgstr "レイヤー %s" - -#~ msgid "VBR (avg. %d kbps)" -#~ msgstr "可変ビットレート (平均 %d kbps)" - -#~ msgid "%d Hz" -#~ msgstr "%d Hz" - -#~ msgid "%d frames" -#~ msgstr "%d フレーム" - -#~ msgid "%d:%02d (%d seconds)" -#~ msgstr "%d:%02d (%d 秒)" - -#~ msgid "RG_album=%4s (x%4.2f)" -#~ msgstr "RGアルバム=%4s (x%4.2f)" - -#~ msgid "RG_track=%4s (x%4.2f)" -#~ msgstr "RGトラック=%4s (x%4.2f)" - -#~ msgid "Peak album=%4s (%+5.3fdBFS)" -#~ msgstr "ピークアルバム=%4s (%+5.3fdBFS)" - -#~ msgid "Peak track=%4s (%+5.3fdBFS)" -#~ msgstr "ピークトラック=%4s (%+5.3fdBFS)" - -#~ msgid "mp3gain undo=%4s (%+5.3fdB)" -#~ msgstr "mp3ゲイン アンドゥ=%4s (%+5.3fdB)" - -#~ msgid "mp3gain minmax=%4s (max-min=%+6.3fdB)" -#~ msgstr "mp3ゲイン minmax=%4s (max-min=%+6.3fdB)" - -#~ msgid "Classic Rock" -#~ msgstr "クラシックロック" - -#~ msgid "Country" -#~ msgstr "カントリー" - -#~ msgid "Dance" -#~ msgstr "ダンス" - -#~ msgid "Disco" -#~ msgstr "ディスコ" - -#~ msgid "Funk" -#~ msgstr "ファンキー" - -#~ msgid "Grunge" -#~ msgstr "グランジ" - -#~ msgid "Hip-Hop" -#~ msgstr "ヒップホップ" - -#~ msgid "Jazz" -#~ msgstr "ジャズ" - -#~ msgid "Metal" -#~ msgstr "メタル" - -#~ msgid "New Age" -#~ msgstr "ニューエイジ" - -#~ msgid "Oldies" -#~ msgstr "オールディーズ" - -#~ msgid "Other" -#~ msgstr "その他" - -#~ msgid "Pop" -#~ msgstr "ポップ" - -#~ msgid "R&B" -#~ msgstr "R&B" - -#~ msgid "Rap" -#~ msgstr "ラップ" - -#~ msgid "Reggae" -#~ msgstr "レゲェ" - -#~ msgid "Rock" -#~ msgstr "ロック" - -#~ msgid "Techno" -#~ msgstr "テクノ" - -#~ msgid "Industrial" -#~ msgstr "インダストリアル" - -#~ msgid "Alternative" -#~ msgstr "オルタナティヴ" - -#~ msgid "Ska" -#~ msgstr "スカ" - -#~ msgid "Death Metal" -#~ msgstr "デスメタル" - -#~ msgid "Soundtrack" -#~ msgstr "サウンドトラック" - -#~ msgid "Euro-Techno" -#~ msgstr "ユーロテクノ" - -#~ msgid "Ambient" -#~ msgstr "アンビエント" - -#~ msgid "Trip-Hop" -#~ msgstr "トリップホップ" - -#~ msgid "Vocal" -#~ msgstr "ヴォーカル" - -#~ msgid "Jazz+Funk" -#~ msgstr "ジャズ+ファンク" - -#~ msgid "Fusion" -#~ msgstr "フュージョン" - -#~ msgid "Trance" -#~ msgstr "トランス" - -#~ msgid "Classical" -#~ msgstr "クラシカル" - -#~ msgid "Instrumental" -#~ msgstr "インストゥルメンタル" - -#~ msgid "Acid" -#~ msgstr "アシッド" - -#~ msgid "House" -#~ msgstr "ハウス" - -#~ msgid "Game" -#~ msgstr "ゲーム" - -#~ msgid "Sound Clip" -#~ msgstr "サウンドクリップ" - -#~ msgid "Gospel" -#~ msgstr "ゴスペル" - -#~ msgid "Noise" -#~ msgstr "ノイズ" - -#~ msgid "AlternRock" -#~ msgstr "オルタナロック" - -#~ msgid "Soul" -#~ msgstr "ソウル" - -#~ msgid "Punk" -#~ msgstr "パンク" - -#~ msgid "Space" -#~ msgstr "スペース" - -#~ msgid "Meditative" -#~ msgstr "教会音楽" - -#~ msgid "Instrumental Pop" -#~ msgstr "インストゥルメンタルポップ" - -#~ msgid "Instrumental Rock" -#~ msgstr "インストゥルメンタルロック" - -#~ msgid "Ethnic" -#~ msgstr "エスニック" - -#~ msgid "Gothic" -#~ msgstr "ゴシック" - -#~ msgid "Darkwave" -#~ msgstr "ダークウェーヴ" - -#~ msgid "Techno-Industrial" -#~ msgstr "テクノインスツルメント" - -#~ msgid "Electronic" -#~ msgstr "エレクトロニック" - -#~ msgid "Pop-Folk" -#~ msgstr "ポップフォーク" - -#~ msgid "Eurodance" -#~ msgstr "ユーロダンス" - -#~ msgid "Dream" -#~ msgstr "ドリーム" - -#~ msgid "Southern Rock" -#~ msgstr "サザンロック" - -#~ msgid "Comedy" -#~ msgstr "コメディ" - -#~ msgid "Cult" -#~ msgstr "カルト" - -#~ msgid "Gangsta Rap" -#~ msgstr "ギャングスタラップ" - -#~ msgid "Top 40" -#~ msgstr "トップ 40" - -#~ msgid "Christian Rap" -#~ msgstr "クリスチャンラップ" - -#~ msgid "Pop/Funk" -#~ msgstr "ポップ/ファンキー" - -#~ msgid "Jungle" -#~ msgstr "ジャングル" - -#~ msgid "Native American" -#~ msgstr "ネイティヴアメリカン" - -#~ msgid "Cabaret" -#~ msgstr "キャバレー" - -#~ msgid "New Wave" -#~ msgstr "ニューウェーブ" - -#~ msgid "Psychedelic" -#~ msgstr "サイケデリック" - -#~ msgid "Rave" -#~ msgstr "レイブ" - -#~ msgid "Trailer" -#~ msgstr "トレイラー" - -#~ msgid "Lo-Fi" -#~ msgstr "ローファイ" - -#~ msgid "Tribal" -#~ msgstr "トリバル" - -#~ msgid "Acid Punk" -#~ msgstr "アシッドパンク" - -#~ msgid "Acid Jazz" -#~ msgstr "アシッドジャズ" - -#~ msgid "Polka" -#~ msgstr "ポルカ" - -#~ msgid "Musical" -#~ msgstr "ミュージカル" - -#~ msgid "Rock & Roll" -#~ msgstr "ロックンロール" - -#~ msgid "Hard Rock" -#~ msgstr "ハードロック" - -#~ msgid "Folk" -#~ msgstr "フォーク" - -#~ msgid "Folk/Rock" -#~ msgstr "フォーク/ロック" - -#~ msgid "National Folk" -#~ msgstr "ナショナルフォーク" - -#~ msgid "Swing" -#~ msgstr "スウィング" - -#~ msgid "Fast-Fusion" -#~ msgstr "ファストフュージョン" - -#~ msgid "Bebob" -#~ msgstr "Bebob" - -#~ msgid "Latin" -#~ msgstr "ラテン" - -#~ msgid "Revival" -#~ msgstr "リバイバル" - -#~ msgid "Celtic" -#~ msgstr "セルティック" - -#~ msgid "Bluegrass" -#~ msgstr "ブルーグラス" - -#~ msgid "Avantgarde" -#~ msgstr "アバンギャルド" - -#~ msgid "Gothic Rock" -#~ msgstr "ゴシックロック" - -#~ msgid "Progressive Rock" -#~ msgstr "プログレッシヴロック" - -#~ msgid "Psychedelic Rock" -#~ msgstr "サイケデリックロック" - -#~ msgid "Symphonic Rock" -#~ msgstr "シンフォニックロック" - -#~ msgid "Slow Rock" -#~ msgstr "スローロック" - -#~ msgid "Big Band" -#~ msgstr "ビッグバンド" - -#~ msgid "Chorus" -#~ msgstr "コーラス" - -#~ msgid "Easy Listening" -#~ msgstr "イージーリスニング" - -#~ msgid "Acoustic" -#~ msgstr "アコースティック" - -#~ msgid "Humour" -#~ msgstr "ユーモア" - -#~ msgid "Speech" -#~ msgstr "スピーチ" - -#~ msgid "Chanson" -#~ msgstr "シャンソン" - -#~ msgid "Opera" -#~ msgstr "オペラ" - -#~ msgid "Chamber Music" -#~ msgstr "チャンバーミュージック" - -#~ msgid "Sonata" -#~ msgstr "ソナタ" - -#~ msgid "Symphony" -#~ msgstr "シンフォニー" - -#~ msgid "Booty Bass" -#~ msgstr "ブーティベース" - -#~ msgid "Primus" -#~ msgstr "プリマス" - -#~ msgid "Porn Groove" -#~ msgstr "ポルノグルーヴ" - -#~ msgid "Slow Jam" -#~ msgstr "スロージャム" - -#~ msgid "Club" -#~ msgstr "クラブ" - -#~ msgid "Tango" -#~ msgstr "タンゴ" - -#~ msgid "Samba" -#~ msgstr "サンバ" - -#~ msgid "Folklore" -#~ msgstr "フォークロア" - -#~ msgid "Ballad" -#~ msgstr "バラード" - -#~ msgid "Power Ballad" -#~ msgstr "パワーバラード" - -#~ msgid "Rhythmic Soul" -#~ msgstr "リズミックソウル" - -#~ msgid "Freestyle" -#~ msgstr "フリースタイル" - -#~ msgid "Duet" -#~ msgstr "デュエット" - -#~ msgid "Punk Rock" -#~ msgstr "パンクロック" - -#~ msgid "Drum Solo" -#~ msgstr "ドラムソロ" - -#~ msgid "A Cappella" -#~ msgstr "ア・カペラ" - -#~ msgid "Euro-House" -#~ msgstr "ユーロハウス" - -#~ msgid "Dance Hall" -#~ msgstr "ダンスホール" - -#~ msgid "Goa" -#~ msgstr "ゴア" - -#~ msgid "Drum & Bass" -#~ msgstr "ドラム&バス" - -#~ msgid "Club-House" -#~ msgstr "クラブハウス" - -#~ msgid "Hardcore" -#~ msgstr "ハードコア" - -#~ msgid "Terror" -#~ msgstr "テラー" - -#~ msgid "Indie" -#~ msgstr "インディーズ" - -#~ msgid "BritPop" -#~ msgstr "ブリットポップ" - -#~ msgid "Negerpunk" -#~ msgstr "ニガーパンク" - -#~ msgid "Polsk Punk" -#~ msgstr "ポルスクパンク" - -#~ msgid "Christian Gangsta Rap" -#~ msgstr "クリスチャンギャングスタラップ" - -#~ msgid "Heavy Metal" -#~ msgstr "ヘヴィーメタル" - -#~ msgid "Black Metal" -#~ msgstr "ブラックメタル" - -#~ msgid "Crossover" -#~ msgstr "クロスオーバー" - -#~ msgid "Contemporary Christian" -#~ msgstr "コンテンポラリクリスチャン" - -#~ msgid "Christian Rock" -#~ msgstr "クリスチャンロック" - -#~ msgid "Merengue" -#~ msgstr "メレンゲ" - -#~ msgid "Salsa" -#~ msgstr "サルサ" - -#~ msgid "Thrash Metal" -#~ msgstr "トラッシュメタル" - -#~ msgid "Anime" -#~ msgstr "アニメ" - -#~ msgid "JPop" -#~ msgstr "Jポップ" - -#~ msgid "Synthpop" -#~ msgstr "シンセポップ" - -#~ msgid "" -#~ "An error occured:\n" -#~ "%s" -#~ msgstr "" -#~ "エラー発生:\n" -#~ "%s" - -#~ msgid "Error!" -#~ msgstr "エラー!" - -#~ msgid "Failed to modify tag (open)" -#~ msgstr "タグの修正に失敗しました (open)" - -#~ msgid "Failed to modify tag (close)" -#~ msgstr "タグの修正に失敗しました (close)" - -#~ msgid "Failed to modify tag" -#~ msgstr "タグの修正に失敗" - -#~ msgid " Ogg Vorbis Tag " -#~ msgstr " Ogg Vorbis タグ " - -#~ msgid "Description:" -#~ msgstr "詳細:" - -#~ msgid "Version:" -#~ msgstr "バージョン:" - -#~ msgid "ISRC number:" -#~ msgstr "ISRC 番号:" - -#~ msgid " Ogg Vorbis ReplayGain " -#~ msgstr " Ogg Vorbis リプレイゲイン " - -#~ msgid "Track peak:" -#~ msgstr "トラックのピーク:" - -#~ msgid "Album gain:" -#~ msgstr "アルバムのゲイン:" - -#~ msgid "Album peak:" -#~ msgstr "アルバムのピーク:" - -#~ msgid " Ogg Vorbis Info " -#~ msgstr " Ogg Vorbis 情報 " - -#~ msgid "Bit rate:" -#~ msgstr "ビットレート:" - -#~ msgid "Sample rate:" -#~ msgstr "サンプリングレート:" - -#~ msgid "Length:" -#~ msgstr "演奏時間:" - -#~ msgid "File size:" -#~ msgstr "ファイルサイズ:" - -#~ msgid "N/A" -#~ msgstr "N/A" - -#~ msgid "%d KBit/s (nominal)" -#~ msgstr "%d Kビット/秒 (ノーマル)" - -#~ msgid "%d" -#~ msgstr "%d" - -#~ msgid "%d:%.2d" -#~ msgstr "%d:%.2d" - -#~ msgid "%d Bytes" -#~ msgstr "%d バイト" - -#~ msgid "Use software volume control" -#~ msgstr "ソフトウェア音量コントロールを使う" - -#~ msgid "" -#~ "You cannot use the FileWriter plugin\n" -#~ "when you're running in realtime mode." -#~ msgstr "" -#~ "リアルタイムモードで実行しているとき\n" -#~ "ファイルライタ プラグインは利用できません." - -#~ msgid "Tune #%i" -#~ msgstr "チューン #%i" - -#~ msgid "6581 (reSID)" -#~ msgstr "6581 (reSID)" - -#~ msgid "8580 (reSID)" -#~ msgstr "8580 (reSID)" - -#~ msgid "6581R1 (alankila)" -#~ msgstr "6581R1 (alankila)" - -#~ msgid "6581R4 (alankila)" -#~ msgstr "6581R4 (alankila)" - -#~ msgid "" -#~ "XMMS v1.2.5 and later support generic titlestring formatting (see XMMS " -#~ "preferences). This option can be enabled to override those generic titles " -#~ "with Audacious-SID specific ones. Formatting mnemonics are explained " -#~ "briefly below." -#~ msgstr "" -#~ "XMMS v1.2.5 以降は一般的なタイトル文字フォーマットをサポートしています " -#~ "(XMMS 設定をご覧ください). 有効ならば, Audacious-SID で指定したものを上書" -#~ "きします. フォーマットルールは以下に説明があります." - -#~ msgid "Override generic XMMS titles" -#~ msgstr "一般的な XMMS のタイトルを上書きする" - -#~ msgid "" -#~ "%% - '%' character\n" -#~ "%p - Performer/composer\n" -#~ "%t - Song name (title)\n" -#~ "%c - Copyright\n" -#~ "%s - File type\n" -#~ "%m - SID model" -#~ msgstr "" -#~ "%% - '%' 文字\n" -#~ "%p - 演奏者/作曲者\n" -#~ "%t - 曲名 (タイトル)\n" -#~ "%c - 著作権\n" -#~ "%s - ファイル形式\n" -#~ "%m - SID モデル" - -#~ msgid "" -#~ "%C - Speed/clock (PAL/NTSC)\n" -#~ "%n - Subtune\n" -#~ "%N - Number of subtunes\n" -#~ "%f - Filename\n" -#~ "%F - File path\n" -#~ "%e - File extension" -#~ msgstr "" -#~ "%C - 速度/クロック (PAL/NTSC)\n" -#~ "%n - サブチューン\n" -#~ "%N - サブチューン数\n" -#~ "%f - ファイル名\n" -#~ "%F - ファイルパス\n" -#~ "%e - ファイル拡張子" - -#~ msgid "No sub-tune control." -#~ msgstr "サブチューンコントロールがありません." - -#~ msgid "Disabled" -#~ msgstr "無効" - -#~ msgid "" -#~ "Seeking backwards/forwards selects previous/next sub-tune, similar to " -#~ "selector used in XMMS-SidPlay." -#~ msgstr "" -#~ "後方/前方のシークは, XMMS-SidPlay で用いられるセレクタのように, 以前/以後" -#~ "のサブチューンを選択します. " - -#~ msgid "Seek back/forward changes sub-tune" -#~ msgstr "後方/前方のシークでサブチューンを変更" - -#~ msgid "" -#~ "By pressing the seekbar a sub-tune control window pops up, in style of " -#~ "UADE (Unix Amiga Delitracker Emulator)" -#~ msgstr "" -#~ "シークバーを押すことで, UADE (Unix Amiga Delitracker Emulator) のようにサ" -#~ "ブチューンコントロールウィンドウがポップアップします." - -#~ msgid "Pop-up via seekbar (UADE-style)" -#~ msgstr "シークバー経由でポップアップ (UADE-style)" - -#~ msgid "" -#~ "Seekbar works as a sub-tune selector (Best option if you have patched " -#~ "your XMMS with the song-position patch.)" -#~ msgstr "" -#~ "シークバーがサブチューンセレクタとして動作します (XMMS に曲位置パッチを当" -#~ "てているなら最上のオプションです)." - -#~ msgid "Song-position patch" -#~ msgstr "曲位置パッチ" - -#~ msgid "Go through all sub-tunes in file" -#~ msgstr "ファイル中のサブチューンを一通り用いる" - -#~ msgid "Automatic sub-tune changes:" -#~ msgstr "自動サブチューン変更:" - -#~ msgid "" -#~ "Determine if file is a SID-tune by checking the file contents. If NOT " -#~ "selected, filetype is determined by checking filename extension (.sid, ." -#~ "dat, ...)" -#~ msgstr "" -#~ "ファイルの内容を確認してファイルが SID-tune かどうかを決定します. 選択され" -#~ "ていなければ, .sid や .dat などのファイル拡張子でファイルタイプを決定しま" -#~ "す." - -#~ msgid "Detect file by contents (slower)" -#~ msgstr "内容でファイルタイプを決定 (遅い)" - -#~ msgid " < " -#~ msgstr " < " - -#~ msgid " > " -#~ msgstr " > " - -#~ msgid " " -#~ msgstr " " - -#~ msgid "#" -#~ msgstr "#" - -#~ msgid " / " -#~ msgstr " / " - -#~ msgid ":" -#~ msgstr ":" - -#~ msgid "8000" -#~ msgstr "8000" - -#~ msgid "11025" -#~ msgstr "11025" - -#, fuzzy -#~ msgid "22050" -#~ msgstr "22000 Hz" - -#, fuzzy -#~ msgid "44100" -#~ msgstr "44100 Hz" - -#, fuzzy -#~ msgid "12000" -#~ msgstr "11000 Hz" - -#, fuzzy -#~ msgid "24000" -#~ msgstr "22000 Hz" - -#, fuzzy -#~ msgid "32000" -#~ msgstr "22000 Hz" - -#~ msgid "OSS Output Plugin" -#~ msgstr "OSS 出力プラグイン" - -#~ msgid "Drive %d" -#~ msgstr "ドライブ %d" - -#~ msgid "" -#~ "Failed to open device %s\n" -#~ "Error: %s\n" -#~ "\n" -#~ msgstr "" -#~ "デバイス %s のオープンに失敗しました.\n" -#~ "[ERROR] %s\n" -#~ "\n" - -#~ msgid "" -#~ "Failed to read \"Table of Contents\"\n" -#~ "Maybe no disc in the drive?\n" -#~ "\n" -#~ msgstr "" -#~ "\"目次\" の読み込みに失敗しました.\n" -#~ "ドライブにディスクが入っていないかも?\n" -#~ "\n" - -#~ msgid "" -#~ "Device %s OK.\n" -#~ "Disc has %d tracks" -#~ msgstr "" -#~ "デバイス %s は OK です.\n" -#~ "ディスクには %d 個のトラックがあります." - -#~ msgid " (%d data tracks)" -#~ msgstr " (%d 個のデータトラック)" - -#~ msgid "" -#~ "Digital audio extraction not tested as the disc has no audio tracks\n" -#~ msgstr "" -#~ "ディスクにオーディオトラックが無いので, ディジタルオーディオ抽出のテストは" -#~ "行いません.\n" - -#~ msgid "" -#~ "Digital audio extraction test: OK\n" -#~ "\n" -#~ msgstr "ディジタルオーディオ抽出のテスト: OK\n" - -#~ msgid "" -#~ "Digital audio extraction test failed: %s\n" -#~ "\n" -#~ msgstr "ディジタルオーディオ抽出のテスト: 失敗 (%s)\n" - -#~ msgid "" -#~ "Failed to check directory %s\n" -#~ "Error: %s" -#~ msgstr "" -#~ "ディレクトリ %s のチェックに失敗しました.\n" -#~ "[ERROR] %s" - -#~ msgid "Error: %s exist, but is not a directory" -#~ msgstr "[ERROR] %s は存在していますが, ディレクトリではありません." - -#~ msgid "Directory %s OK." -#~ msgstr "ディレクトリ %s: OK" - -#~ msgid "Device:" -#~ msgstr "デバイス:" - -#~ msgid "_Device:" -#~ msgstr "デバイス(_D):" - -#~ msgid "Dir_ectory:" -#~ msgstr "ディレクトリ(_E):" - -#~ msgid "Analog" -#~ msgstr "アナログ" - -#~ msgid "No mixer" -#~ msgstr "ミキサなし" - -#~ msgid "CDROM drive" -#~ msgstr "CD-ROM ドライブ" - -#~ msgid "OSS mixer" -#~ msgstr "OSS ミキサ" - -#~ msgid "Check drive..." -#~ msgstr "ドライブのチェック..." - -#~ msgid "CD Audio Player Configuration" -#~ msgstr "CD オーディオプレイヤの設定" - -#~ msgid "Add drive" -#~ msgstr "ドライブの追加" - -#~ msgid "Device" -#~ msgstr "デバイス" - -#~ msgid "CDDB:" -#~ msgstr "CDDB:" - -#~ msgid "Use CDDB" -#~ msgstr "CDDB を利用する" - -#~ msgid "Get server list" -#~ msgstr "サーバリストの取得" - -#~ msgid "CDDB server:" -#~ msgstr "CDDB サーバ:" - -#~ msgid "Track names:" -#~ msgstr "トラック名:" - -#~ msgid "Name format:" -#~ msgstr "名前の書式:" - -#~ msgid "CD Audio Plugin" -#~ msgstr "CD オーディオ プラグイン" - -#~ msgid "CD Audio Track %02u" -#~ msgstr "CD オーディオトラック %02u" - -#~ msgid "Game console audio module decoder" -#~ msgstr "ゲームコンソールオーディオモジュールデコーダ" - -#~ msgid "NSF/NSFE" -#~ msgstr "NSF/NSFE" - -#~ msgid "Use optional NSFE playlist" -#~ msgstr "オプションの NSFE プレイリストを使う" - -#~ msgid "Disk Writer Plugin %s" -#~ msgstr "ディスクライター プラグイン %s" - -#~ msgid "eSound Output Plugin" -#~ msgstr "eSound 出力プラグイン" - -#~ msgid "Extra Stereo Plugin %s" -#~ msgstr "エクストラステレオ プラグイン %s" - -#~ msgid "BSD Sun Driver %s" -#~ msgstr "BSD Sub ドライバ %s" - -#~ msgid "TiMidity Player %s" -#~ msgstr "TiMidity プレイヤー %s" - -#~ msgid "Tone Generator %s" -#~ msgstr "トーンジェネレータ %s" - -#~ msgid "Ogg Vorbis Audio Plugin" -#~ msgstr "Ogg Vorbis オーディオ プラグイン" - -#~ msgid "WAV Audio Plugin" -#~ msgstr "WAV オーディオ プラグイン" - -#~ msgid "ALSA %s output plugin" -#~ msgstr "ALSA %s 出力プラグイン" - -#~ msgid "AMIDI-Plug %s (MIDI Player)" -#~ msgstr "AMIDI-Plug %s (MIDI プレイヤ)" - -#~ msgid "AMIDI-Plug - warning" -#~ msgstr "AMIDI-Plug - 警告" - -#~ msgid "" -#~ "No sequencer backend has been selected!\n" -#~ "Please configure AMIDI-Plug before playing." -#~ msgstr "" -#~ "シーケンサバックエンドが選択されていません!\n" -#~ "演奏前に AMIDI-Plug を設定してください." - -#~ msgid "" -#~ "\n" -#~ "EvDev-Plug " -#~ msgstr "" -#~ "\n" -#~ "EvDev-Plug " - -#~ msgid "Arabic (IBM-864)" -#~ msgstr "アラビア語 (IBM-864)" - -#~ msgid "Arabic (ISO-8859-6)" -#~ msgstr "アラビア語 (ISO-8859-6)" - -#~ msgid "Arabic (Windows-1256)" -#~ msgstr "アラビア語 (Windows-1256)" - -#~ msgid "Baltic (ISO-8859-13)" -#~ msgstr "バルト諸語 (ISO-8859-13)" - -#~ msgid "Baltic (ISO-8859-4)" -#~ msgstr "バルト諸語 (ISO-8859-4)" - -#~ msgid "Baltic (Windows-1257)" -#~ msgstr "バルト諸語 (Windows-1257)" - -#~ msgid "Celtic (ISO-8859-14)" -#~ msgstr "ケルト語 (ISO-8859-14)" - -#~ msgid "Central European (IBM-852)" -#~ msgstr "中欧諸語 (IBM-852)" - -#~ msgid "Central European (ISO-8859-2)" -#~ msgstr "中欧諸語 (ISO-8859-2)" - -#~ msgid "Central European (Windows-1250)" -#~ msgstr "中欧諸語 (Windows-1250)" - -#~ msgid "Chinese Simplified (GB18030)" -#~ msgstr "簡体字中国語 (GB18030)" - -#~ msgid "Chinese Simplified (GB2312)" -#~ msgstr "簡体字中国語 (GB2312)" - -#~ msgid "Chinese Traditional (Big5)" -#~ msgstr "繁体字中国語 (Big5)" - -#~ msgid "Chinese Traditional (Big5-HKSCS)" -#~ msgstr "繁体字中国語 (Big5-HKSCS)" - -#~ msgid "Cyrillic (IBM-855)" -#~ msgstr "キリル文字 (IBM-855)" - -#~ msgid "Cyrillic (ISO-8859-5)" -#~ msgstr "キリル文字 (ISO-8859-5)" - -#~ msgid "Cyrillic (ISO-IR-111)" -#~ msgstr "キリル文字 (ISO-IR-111)" - -#~ msgid "Cyrillic (KOI8-R)" -#~ msgstr "キリル文字 (KOI8-R)" - -#~ msgid "Cyrillic (Windows-1251)" -#~ msgstr "キリル文字 (Windows-1251)" - -#~ msgid "Cyrillic/Russian (CP-866)" -#~ msgstr "キリル文字/ロシア語 (CP-866)" - -#~ msgid "Cyrillic/Ukrainian (KOI8-U)" -#~ msgstr "キリル文字/ウクライナ語 (KOI8-U)" - -#~ msgid "English (US-ASCII)" -#~ msgstr "英語 (US-ASCII)" - -#~ msgid "Greek (ISO-8859-7)" -#~ msgstr "ギリシャ語 (ISO-8859-7)" - -#~ msgid "Greek (Windows-1253)" -#~ msgstr "ギリシャ語 (Windows-1253)" - -#~ msgid "Hebrew (IBM-862)" -#~ msgstr "ヘブライ語 (IBM-862)" - -#~ msgid "Hebrew (Windows-1255)" -#~ msgstr "ヘブライ語 (Windows-1255)" - -#~ msgid "Japanese (EUC-JP)" -#~ msgstr "日本語 (EUC-JP)" - -#~ msgid "Japanese (ISO-2022-JP)" -#~ msgstr "日本語 (ISO-2022-JP)" - -#~ msgid "Japanese (Shift_JIS)" -#~ msgstr "日本語 (Shift_JIS)" - -#~ msgid "Korean (EUC-KR)" -#~ msgstr "韓国語 (EUC-KR)" - -#~ msgid "Nordic (ISO-8859-10)" -#~ msgstr "北欧諸語 (ISO-8859-10)" - -#~ msgid "South European (ISO-8859-3)" -#~ msgstr "南欧諸語 (ISO-8859-3)" - -#~ msgid "Thai (TIS-620)" -#~ msgstr "タイ語 (TIS-620)" - -#~ msgid "Turkish (IBM-857)" -#~ msgstr "トルコ語 (IBM-857)" - -#~ msgid "Turkish (ISO-8859-9)" -#~ msgstr "トルコ語 (ISO-8859-9)" - -#~ msgid "Turkish (Windows-1254)" -#~ msgstr "トルコ語 (Windows-1254)" - -#~ msgid "Unicode (UTF-7)" -#~ msgstr "Unicode (UTF-7)" - -#~ msgid "Unicode (UTF-8)" -#~ msgstr "Unicode (UTF-8)" - -#~ msgid "Unicode (UTF-16BE)" -#~ msgstr "Unicode (UTF-16BE)" - -#~ msgid "Unicode (UTF-16LE)" -#~ msgstr "Unicode (UTF-16LE)" - -#~ msgid "Unicode (UTF-32BE)" -#~ msgstr "Unicode (UTF-32BE)" - -#~ msgid "Unicode (UTF-32LE)" -#~ msgstr "Unicode (UTF-32LE)" - -#~ msgid "Vietnamese (VISCII)" -#~ msgstr "ヴェトナム語 (VISCII)" - -#~ msgid "Vietnamese (Windows-1258)" -#~ msgstr "ヴェトナム語 (Windows-1258)" - -#~ msgid "Visual Hebrew (ISO-8859-8)" -#~ msgstr "ヘブライ語(表示用) (ISO-8859-8)" - -#~ msgid "Western (IBM-850)" -#~ msgstr "西欧諸語 (IBM-850)" - -#~ msgid "Western (ISO-8859-1)" -#~ msgstr "西欧諸語 (ISO-8859-1)" - -#~ msgid "Western (ISO-8859-15)" -#~ msgstr "西欧諸語 (ISO-8859-15)" - -#~ msgid "Western (Windows-1252)" -#~ msgstr "西欧諸語 (Windows-1252)" - -#~ msgid "Arabic (IBM-864-I)" -#~ msgstr "アラビア語 (IBM-864-I)" - -#~ msgid "Arabic (ISO-8859-6-E)" -#~ msgstr "アラビア語 (ISO-8859-6-E)" - -#~ msgid "Arabic (ISO-8859-6-I)" -#~ msgstr "アラビア語 (ISO-8859-6-I)" - -#~ msgid "Arabic (MacArabic)" -#~ msgstr "アラビア語 (MacArabic)" - -#~ msgid "Armenian (ARMSCII-8)" -#~ msgstr "アルメニア語 (ARMSCII-8)" - -#~ msgid "Central European (MacCE)" -#~ msgstr "中欧諸語 (MacCE)" - -#~ msgid "Chinese Simplified (GBK)" -#~ msgstr "簡体字中国語 (GBK)" - -#~ msgid "Chinese Simplified (HZ)" -#~ msgstr "簡体字中国語 (HZ)" - -#~ msgid "Chinese Traditional (EUC-TW)" -#~ msgstr "繁体字中国語 (EUC-TW)" - -#~ msgid "Croatian (MacCroatian)" -#~ msgstr "クロアチア語 (MacCroatian)" - -#~ msgid "Cyrillic (MacCyrillic)" -#~ msgstr "キリル文字 (MacCyrillic)" - -#~ msgid "Cyrillic/Ukrainian (MacUkrainian)" -#~ msgstr "キリル文字/ウクライナ語 (MacUkrainian)" - -#~ msgid "Farsi (MacFarsi)" -#~ msgstr "ペルシャ語 (MacFarsi)" - -#~ msgid "Greek (MacGreek)" -#~ msgstr "ギリシャ語 (MacGreek)" - -#~ msgid "Gujarati (MacGujarati)" -#~ msgstr "グジャラート語 (MacGujarati)" - -#~ msgid "Gurmukhi (MacGurmukhi)" -#~ msgstr "グルムキー文字 (MacGurmukhi)" - -#~ msgid "Hebrew (ISO-8859-8-E)" -#~ msgstr "ヘブライ語 (ISO-8859-8-E)" - -#~ msgid "Hebrew (ISO-8859-8-I)" -#~ msgstr "ヘブライ語 (ISO-8859-8-I)" - -#~ msgid "Hebrew (MacHebrew)" -#~ msgstr "ヘブライ語 (MacHebrew)" - -#~ msgid "Hindi (MacDevanagari)" -#~ msgstr "ヒンディ語 (MacDevanagari)" - -#~ msgid "Icelandic (MacIcelandic)" -#~ msgstr "アイスランド語 (MacIcelandic)" - -#~ msgid "Korean (JOHAB)" -#~ msgstr "朝鮮語 (JOHAB)" - -#~ msgid "Korean (UHC)" -#~ msgstr "朝鮮語 (UHC)" - -#~ msgid "Romanian (MacRomanian)" -#~ msgstr "ルーマニア語 (MacRomanian)" - -#~ msgid "Turkish (MacTurkish)" -#~ msgstr "トルコ語 (MacTurkish)" - -#~ msgid "Vietnamese (TCVN)" -#~ msgstr "ヴェトナム語 (TCVN)" - -#~ msgid "Vietnamese (VPS)" -#~ msgstr "ヴェトナム語 (VPS)" - -#~ msgid "Western (MacRoman)" -#~ msgstr "西欧諸語 (MacRoman)" - -#~ msgid "Tag Handling" -#~ msgstr "タグの取扱" - -#~ msgid "Convert Character Set" -#~ msgstr "キャラクタセット変換" - -#~ msgid "Convert character set from :" -#~ msgstr "キャラクタセットを変換する" - -#~ msgid "Disable bitrate update during playback (saves cpu usage)" -#~ msgstr "演奏中のビットレート更新を無効にする (CPU 利用を節約)" - -#~ msgid "Album mode" -#~ msgstr "アルバムモード" - -#~ msgid "0 dB" -#~ msgstr "0 dB" - -#~ msgid "Without ReplayGain" -#~ msgstr "リプレイゲインなし" - -#~ msgid "Dither 24bps to 16bps" -#~ msgstr "24bps から 16bps へディザリング" - -#~ msgid "With ReplayGain" -#~ msgstr "リプレイゲインあり" - -#~ msgid "Noise shaping" -#~ msgstr "ノイズシェーピング" - -#~ msgid "high" -#~ msgstr "高" - -#~ msgid "Dither to" -#~ msgstr "ディザリング" - -#~ msgid "16 bps" -#~ msgstr "16 bps" - -#~ msgid "24 bps" -#~ msgstr "24 bps" - -#~ msgid "Output" -#~ msgstr "出力" - -#~ msgid "" -#~ "Flac Plugin by Josh Coalson\n" -#~ "contributions by\n" -#~ "......\n" -#~ "......\n" -#~ "and\n" -#~ "Daisuke Shimamura\n" -#~ "Visit http://flac.sourceforge.net/\n" -#~ "\n" -#~ "Audacious Team port" -#~ msgstr "" -#~ "Josh Coalson による Flac プラグイン\n" -#~ "貢献者\n" -#~ "......\n" -#~ "......\n" -#~ "と\n" -#~ "Daisuke Shimamura\n" -#~ "http://flac.sourceforge.net/ を訪れてください\n" -#~ "\n" -#~ "Audacious Team port" - -#~ msgid "Alt" -#~ msgstr "Alt" - -#~ msgid "Blocksize: %d" -#~ msgstr "ブロックサイズ: %d" - -#~ msgid "" -#~ "Blocksize: variable\n" -#~ " min/max: %d/%d" -#~ msgstr "" -#~ "ブロックサイズ: 可変\n" -#~ " 最小/最大: %d/%d" - -#~ msgid "FLAC Info:" -#~ msgstr "FLAC 情報:" - -#~ msgid "Filesize: %lld B" -#~ msgstr "ファイルサイズ: %lld B" - -#~ msgid "ReplayGain Reference Loudness: %2.1f dB" -#~ msgstr "リプレイゲイン リファレンスラウドネス: %2.1f dB" - -#~ msgid "ReplayGain Track Peak: %1.8f" -#~ msgstr "リプレイゲイン トラック ピーク: %1.8f" - -#~ msgid "ReplayGain Album Peak: %1.8f" -#~ msgstr "リプレイゲイン アルバム ピーク: %1.8f" diff -r 2d3594eaa18a -r 9e06acde819e src/sid/Makefile --- a/src/sid/Makefile Sat Jul 12 03:39:25 2008 +0300 +++ b/src/sid/Makefile Sat Jul 12 03:39:55 2008 +0300 @@ -25,4 +25,5 @@ CFLAGS += ${PLUGIN_CFLAGS} CXXFLAGS += ${PLUGIN_CFLAGS} CPPFLAGS += ${PLUGIN_CPPFLAGS} -D_REENTRANT -I../.. -DAUDACIOUS_PLUGIN ${MOWGLI_CFLAGS} ${SIDPLAY1_CFLAGS} ${SIDPLAY2_CFLAGS} ${BUILDERS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} +LDFLAGS += ${AUDLDFLAGS} LIBS += ${BUILDERS_LDFLAGS} ${SIDPLAY1_LIBS} ${SIDPLAY2_LIBS} ${BUILDERS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} -lstdc++ -laudutil diff -r 2d3594eaa18a -r 9e06acde819e src/skins/Makefile --- a/src/skins/Makefile Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/Makefile Sat Jul 12 03:39:55 2008 +0300 @@ -24,6 +24,7 @@ ui_main.c \ ui_equalizer.c \ ui_playlist.c \ + ui_playlist_manager.c \ ui_main_evlisteners.c \ ui_playlist_evlisteners.c \ ui_manager.c \ diff -r 2d3594eaa18a -r 9e06acde819e src/skins/plugin.c --- a/src/skins/plugin.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/plugin.c Sat Jul 12 03:39:55 2008 +0300 @@ -36,7 +36,8 @@ .id = "skinned", .desc = "Audacious Skinned GUI", .init = skins_init, - .fini = skins_cleanup + .fini = skins_cleanup, + .conf = skins_configure }; SIMPLE_INTERFACE_PLUGIN("skinned", &skins_gp); @@ -85,6 +86,8 @@ init_skins(config.skin); mainwin_setup_menus(); + aud_hook_call("create prefswin", NULL); + if (config.player_visible) mainwin_real_show(); if (config.equalizer_visible) equalizerwin_show(TRUE); if (config.playlist_visible) playlistwin_show(); diff -r 2d3594eaa18a -r 9e06acde819e src/skins/skins_cfg.c --- a/src/skins/skins_cfg.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/skins_cfg.c Sat Jul 12 03:39:55 2008 +0300 @@ -547,7 +547,7 @@ } } -void skins_configure(void) { +GtkWidget* skins_configure(void) { GtkWidget *appearance_page_vbox; GtkWidget *vbox37; GtkWidget *vbox38; @@ -561,21 +561,7 @@ GtkWidget *alignment95; GtkWidget *skin_view_scrolled_window; - if (cfg_win != NULL) { - gtk_window_present(GTK_WINDOW(cfg_win)); - return; - } - - cfg_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_type_hint(GTK_WINDOW(cfg_win), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_title(GTK_WINDOW(cfg_win), _("Audacious Skinned GUI Configuration")); - gtk_container_set_border_width(GTK_CONTAINER(cfg_win), 10); - g_signal_connect(G_OBJECT(cfg_win), "destroy" , - G_CALLBACK(gtk_widget_destroyed), &cfg_win); - gtk_widget_set_size_request(cfg_win, 500, -1); - appearance_page_vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add(GTK_CONTAINER(cfg_win), appearance_page_vbox); vbox37 = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (appearance_page_vbox), vbox37, TRUE, TRUE, 0); @@ -658,5 +644,5 @@ gtk_window_present(GTK_WINDOW(cfg_win)); - return; + return appearance_page_vbox; } diff -r 2d3594eaa18a -r 9e06acde819e src/skins/skins_cfg.h --- a/src/skins/skins_cfg.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/skins_cfg.h Sat Jul 12 03:39:55 2008 +0300 @@ -22,6 +22,7 @@ #define SKINS_CFG_H #include +#include #define MAINWIN_DEFAULT_POS_X 20 #define MAINWIN_DEFAULT_POS_Y 20 @@ -86,6 +87,6 @@ void skins_cfg_load(); void skins_cfg_save(); -void skins_configure(void); +GtkWidget* skins_configure(void); #endif diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_equalizer.c --- a/src/skins/ui_equalizer.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/ui_equalizer.c Sat Jul 12 03:39:55 2008 +0300 @@ -46,6 +46,7 @@ #include "ui_main.h" #include "ui_playlist.h" #include +#include #include "images/audacious_eq.xpm" @@ -62,14 +63,6 @@ PRESET_VIEW_N_COLS }; -struct _EqualizerPreset { - gchar *name; - gfloat preamp, bands[10]; -}; - -typedef struct _EqualizerPreset EqualizerPreset; - - GtkWidget *equalizerwin; GtkWidget *equalizerwin_graph; @@ -172,19 +165,31 @@ { gint i; - aud_cfg->equalizer_preamp = ui_skinned_equalizer_slider_get_position(equalizerwin_preamp); - for (i = 0; i < 10; i++) - aud_cfg->equalizer_bands[i] = ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]); + aud_cfg->equalizer_preamp = equalizerwin_get_preamp(); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + aud_cfg->equalizer_bands[i] = equalizerwin_get_band(i); aud_hook_call("equalizer changed", NULL); gtk_widget_queue_draw(equalizerwin_graph); } static void +equalizerwin_apply_preset(EqualizerPreset *preset) +{ + if (preset == NULL) + return; + + gint i; + + equalizerwin_set_preamp(preset->preamp); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + equalizerwin_set_band(i, preset->bands[i]); +} + +static void equalizerwin_on_pushed(void) { - aud_cfg->equalizer_active = UI_SKINNED_BUTTON(equalizerwin_on)->inside; - equalizerwin_eq_changed(); + equalizerwin_activate(!aud_cfg->equalizer_active); } static void @@ -275,59 +280,6 @@ return TRUE; } -static GList * -equalizerwin_read_presets(const gchar * basename) -{ -#if 0 - gchar *filename, *name; - RcFile *rcfile; - GList *list = NULL; - gint i, p = 0; - EqualizerPreset *preset; - - /* START mod: add check for the default presets locate in system path ({prefix}/share/audacious) - by Massimo Cavalleri (submax) */ - - filename = g_build_filename(aud_paths[BMP_PATH_USER_DIR], basename, NULL); - - if ((rcfile = aud_rcfile_open(filename)) == NULL) { - g_free(filename); - // DATA_DIR = "{prefix}/share/audacious" ; example is "/usr/share/audacious" - filename = g_build_filename(DATA_DIR, basename, NULL); - if ((rcfile = aud_rcfile_open(filename)) == NULL) { - g_free(filename); - return NULL; - } - } - - // END mod - - g_free(filename); - - for (;;) { - gchar section[21]; - - g_snprintf(section, sizeof(section), "Preset%d", p++); - if (aud_rcfile_read_string(rcfile, "Presets", section, &name)) { - preset = g_new0(EqualizerPreset, 1); - preset->name = name; - aud_rcfile_read_float(rcfile, name, "Preamp", &preset->preamp); - for (i = 0; i < 10; i++) { - gchar band[7]; - g_snprintf(band, sizeof(band), "Band%d", i); - aud_rcfile_read_float(rcfile, name, band, &preset->bands[i]); - } - list = g_list_prepend(list, preset); - } - else - break; - } - list = g_list_reverse(list); - aud_rcfile_free(rcfile); - return list; -#endif -} - gint equalizerwin_volume_frame_cb(gint pos) { @@ -419,7 +371,7 @@ ui_skinned_toggle_button_setup(equalizerwin_on, SKINNED_WINDOW(equalizerwin)->normal, 14, 18, 25, 12, 10, 119, 128, 119, 69, 119, 187, 119, SKIN_EQMAIN); g_signal_connect(equalizerwin_on, "clicked", equalizerwin_on_pushed, NULL); - ui_skinned_button_set_inside(equalizerwin_on, aud_cfg->equalizer_active); + equalizerwin_activate(aud_cfg->equalizer_active); equalizerwin_auto = ui_skinned_button_new(); ui_skinned_toggle_button_setup(equalizerwin_auto, SKINNED_WINDOW(equalizerwin)->normal, @@ -456,12 +408,12 @@ equalizerwin_graph = ui_skinned_equalizer_graph_new(SKINNED_WINDOW(equalizerwin)->normal, 86, 17); equalizerwin_preamp = ui_skinned_equalizer_slider_new(SKINNED_WINDOW(equalizerwin)->normal, 21, 38); - ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, aud_cfg->equalizer_preamp); + equalizerwin_set_preamp(aud_cfg->equalizer_preamp); - for (i = 0; i < 10; i++) { + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) { equalizerwin_bands[i] = ui_skinned_equalizer_slider_new(SKINNED_WINDOW(equalizerwin)->normal, 78 + (i * 18), 38); - ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], aud_cfg->equalizer_bands[i]); + equalizerwin_set_band(i, aud_cfg->equalizer_bands[i]); } equalizerwin_volume = @@ -528,8 +480,8 @@ void equalizerwin_create(void) { - equalizer_presets = equalizerwin_read_presets("eq.preset"); - equalizer_auto_presets = equalizerwin_read_presets("eq.auto_preset"); + equalizer_presets = aud_equalizer_read_presets("eq.preset"); + equalizer_auto_presets = aud_equalizer_read_presets("eq.auto_preset"); equalizerwin_create_window(); @@ -597,40 +549,6 @@ return NULL; } -static void -equalizerwin_write_preset_file(GList * list, const gchar * basename) -{ -#if 0 - gchar *filename, *tmp; - gint i, p; - EqualizerPreset *preset; - RcFile *rcfile; - GList *node; - - rcfile = aud_rcfile_new(); - p = 0; - for (node = list; node; node = g_list_next(node)) { - preset = node->data; - tmp = g_strdup_printf("Preset%d", p++); - aud_rcfile_write_string(rcfile, "Presets", tmp, preset->name); - g_free(tmp); - aud_rcfile_write_float(rcfile, preset->name, "Preamp", - preset->preamp); - for (i = 0; i < 10; i++) { - tmp = g_strdup_printf("Band%d\n", i); - aud_rcfile_write_float(rcfile, preset->name, tmp, - preset->bands[i]); - g_free(tmp); - } - } - - filename = g_build_filename(aud_paths[BMP_PATH_USER_DIR], basename, NULL); - aud_rcfile_write(rcfile, filename); - aud_rcfile_free(rcfile); - g_free(filename); -#endif -} - static gboolean equalizerwin_load_preset(GList * list, const gchar * name) { @@ -638,10 +556,10 @@ gint i; if ((preset = equalizerwin_find_preset(list, name)) != NULL) { - ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, preset->preamp); - for (i = 0; i < 10; i++) - ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], preset->bands[i]); - equalizerwin_eq_changed(); + equalizerwin_set_preamp(preset->preamp); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + equalizerwin_set_band(i, preset->bands[i]); + return TRUE; } return FALSE; @@ -660,11 +578,11 @@ list = g_list_append(list, preset); } - preset->preamp = ui_skinned_equalizer_slider_get_position(equalizerwin_preamp); - for (i = 0; i < 10; i++) - preset->bands[i] = ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]); + preset->preamp = equalizerwin_get_preamp(); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + preset->bands[i] = equalizerwin_get_band(i); - equalizerwin_write_preset_file(list, filename); + aud_equalizer_write_preset_file(list, filename); return list; } @@ -685,7 +603,7 @@ equalizer_preset_free(preset); g_list_free_1(node); - equalizerwin_write_preset_file(list, filename); + aud_equalizer_write_preset_file(list, filename); return list; } @@ -734,61 +652,6 @@ } } -static GList * -import_winamp_eqf(VFSFile * file) -{ -#if 0 - gchar header[31]; - gchar bands[11]; - gint i = 0; - EqualizerPreset *preset = NULL; - GList *list = NULL; - GtkWidget *dialog; - gchar *realfn; - gchar preset_name[0xb4]; - - vfs_fread(header, 1, 31, file); - if (strncmp(header, "Winamp EQ library file v1.1", 27)) goto error; - - AUDDBG("The EQF header is OK\n"); - - if (vfs_fseek(file, 0x1f, SEEK_SET) == -1) goto error; - - while (vfs_fread(preset_name, 1, 0xb4, file) == 0xb4) { - AUDDBG("The preset name is '%s'\n", preset_name); - vfs_fseek(file, 0x4d, SEEK_CUR); /* unknown crap --asphyx */ - if (vfs_fread(bands, 1, 11, file) != 11) break; - - preset = equalizer_preset_new(preset_name); - /*this was divided by 63, but shouldn't it be 64? --majeru*/ - preset->preamp = EQUALIZER_MAX_GAIN - ((bands[10] * EQUALIZER_MAX_GAIN * 2) / 64.0); - - for (i = 0; i < 10; i++) - preset->bands[i] = EQUALIZER_MAX_GAIN - ((bands[i] * EQUALIZER_MAX_GAIN * 2) / 64.0); - - list = g_list_prepend(list, preset); - } - - list = g_list_reverse(list); - if (list == NULL) goto error; - - return list; - -error: - realfn = g_filename_from_uri(file->uri, NULL, NULL); - dialog = gtk_message_dialog_new (GTK_WINDOW(mainwin), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _("Error importing Winamp EQF file '%s'"), - realfn); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - g_free(realfn); - return NULL; -#endif -} - static void free_cb (gpointer data, gpointer user_data) { @@ -801,41 +664,31 @@ GList *presets; gint i; - if ((presets = import_winamp_eqf(file)) == NULL) + if ((presets = aud_import_winamp_eqf(file)) == NULL) return; /* just get the first preset --asphyx */ EqualizerPreset *preset = (EqualizerPreset*)presets->data; - ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, - preset->preamp); + equalizerwin_set_preamp(preset->preamp); - for (i = 0; i < 10; i++) - ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], - preset->bands[i]); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + equalizerwin_set_band(i, preset->bands[i]); g_list_foreach(presets, free_cb, NULL); g_list_free(presets); equalizerwin_eq_changed(); } -#if 0 + static void -equalizerwin_read_aud_preset(RcFile * rcfile) +equalizerwin_read_aud_preset(const gchar * file) { - gfloat val; - gint i; - - if (aud_rcfile_read_float(rcfile, "Equalizer preset", "Preamp", &val)) - ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, val); - for (i = 0; i < 10; i++) { - gchar tmp[7]; - g_snprintf(tmp, sizeof(tmp), "Band%d", i); - if (aud_rcfile_read_float(rcfile, "Equalizer preset", tmp, &val)) - ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], val); + EqualizerPreset *preset = aud_equalizer_read_aud_preset(file); + if (preset) { + equalizerwin_apply_preset(preset); + equalizer_preset_free(preset); } - equalizerwin_eq_changed(); } -#endif static void equalizerwin_save_ok(GtkWidget * widget, gpointer data) @@ -980,27 +833,13 @@ equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.auto_preset"); } - -static void -load_preset_file(const gchar *filename) -{ -#if 0 - RcFile *rcfile; - - if ((rcfile = aud_rcfile_open(filename)) != NULL) { - equalizerwin_read_aud_preset(rcfile); - aud_rcfile_free(rcfile); - } -#endif -} - static VFSFile * open_vfs_file(const gchar *filename, const gchar *mode) { VFSFile *file; GtkWidget *dialog; - if (!(file = vfs_fopen(filename, mode))) { + if (!(file = aud_vfs_fopen(filename, mode))) { dialog = gtk_message_dialog_new (GTK_WINDOW (mainwin), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, @@ -1017,62 +856,34 @@ static void load_winamp_file(const gchar * filename) { -#if 0 VFSFile *file; if (!(file = open_vfs_file(filename, "rb"))) return; equalizerwin_read_winamp_eqf(file); - vfs_fclose(file); -#endif + aud_vfs_fclose(file); } static void import_winamp_file(const gchar * filename) { -#if 0 VFSFile *file; GList *list; if (!(file = open_vfs_file(filename, "rb")) || - !(list = import_winamp_eqf(file))) + !(list = aud_import_winamp_eqf(file))) return; equalizer_presets = g_list_concat(equalizer_presets, list); - equalizerwin_write_preset_file(equalizer_presets, "eq.preset"); - - vfs_fclose(file); -#endif -} - -static void -save_preset_file(const gchar * filename) -{ -#if 0 - RcFile *rcfile; - gint i; + aud_equalizer_write_preset_file(equalizer_presets, "eq.preset"); - rcfile = aud_rcfile_new(); - aud_rcfile_write_float(rcfile, "Equalizer preset", "Preamp", - ui_skinned_equalizer_slider_get_position(equalizerwin_preamp)); - - for (i = 0; i < 10; i++) { - gchar tmp[7]; - g_snprintf(tmp, sizeof(tmp), "Band%d", i); - aud_rcfile_write_float(rcfile, "Equalizer preset", tmp, - ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i])); - } - - aud_rcfile_write(rcfile, filename); - aud_rcfile_free(rcfile); -#endif + aud_vfs_fclose(file); } static void save_winamp_file(const gchar * filename) { -#if 0 VFSFile *file; gchar name[257]; @@ -1082,19 +893,19 @@ if (!(file = open_vfs_file(filename, "wb"))) return; - vfs_fwrite("Winamp EQ library file v1.1\x1a!--", 1, 31, file); + aud_vfs_fwrite("Winamp EQ library file v1.1\x1a!--", 1, 31, file); memset(name, 0, 257); g_strlcpy(name, "Entry1", 257); - vfs_fwrite(name, 1, 257, file); + aud_vfs_fwrite(name, 1, 257, file); + + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + bands[i] = 63 - (((equalizerwin_get_band(i) + EQUALIZER_MAX_GAIN) * 63) / EQUALIZER_MAX_GAIN / 2); - for (i = 0; i < 10; i++) - bands[i] = 63 - (((ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]) + EQUALIZER_MAX_GAIN) * 63) / EQUALIZER_MAX_GAIN / 2); - bands[10] = 63 - (((ui_skinned_equalizer_slider_get_position(equalizerwin_preamp) + EQUALIZER_MAX_GAIN) * 63) / EQUALIZER_MAX_GAIN / 2); - vfs_fwrite(bands, 1, 11, file); + bands[AUD_EQUALIZER_NBANDS] = 63 - (((equalizerwin_get_preamp() + EQUALIZER_MAX_GAIN) * 63) / EQUALIZER_MAX_GAIN / 2); - vfs_fclose(file); -#endif + aud_vfs_fwrite(bands, 1, 11, file); + aud_vfs_fclose(file); } static GtkWidget * @@ -1210,9 +1021,7 @@ void equalizerwin_load_auto_preset(const gchar * filename) { -#if 0 gchar *presetfilename, *directory; - RcFile *rcfile; g_return_if_fail(filename != NULL); @@ -1222,11 +1031,9 @@ presetfilename = g_strconcat(filename, ".", aud_cfg->eqpreset_extension, NULL); /* First try to find a per file preset file */ - if (strlen(aud_cfg->eqpreset_extension) > 0 && - (rcfile = aud_rcfile_open(presetfilename)) != NULL) { + if (strlen(aud_cfg->eqpreset_extension) > 0) { + equalizerwin_read_aud_preset(presetfilename); g_free(presetfilename); - equalizerwin_read_aud_preset(rcfile); - aud_rcfile_free(rcfile); return; } @@ -1238,10 +1045,8 @@ g_free(directory); /* Try to find a per directory preset file */ - if (strlen(aud_cfg->eqpreset_default_file) > 0 && - (rcfile = aud_rcfile_open(presetfilename)) != NULL) { - equalizerwin_read_aud_preset(rcfile); - aud_rcfile_free(rcfile); + if (strlen(aud_cfg->eqpreset_default_file) > 0) { + equalizerwin_read_aud_preset(presetfilename); } else if (!equalizerwin_load_preset (equalizer_auto_presets, g_basename(filename))) { @@ -1250,7 +1055,6 @@ } g_free(presetfilename); -#endif } void @@ -1263,7 +1067,7 @@ void equalizerwin_set_band(gint band, gfloat value) { - g_return_if_fail(band >= 0 && band < 10); + g_return_if_fail(band >= 0 && band < AUD_EQUALIZER_NBANDS); ui_skinned_equalizer_slider_set_position(equalizerwin_bands[band], value); } @@ -1276,7 +1080,7 @@ gfloat equalizerwin_get_band(gint band) { - g_return_val_if_fail(band >= 0 && band < 10, 0.0); + g_return_val_if_fail(band >= 0 && band < AUD_EQUALIZER_NBANDS, 0.0); return ui_skinned_equalizer_slider_get_position(equalizerwin_bands[band]); } @@ -1287,7 +1091,7 @@ gtk_window_present(GTK_WINDOW(equalizerwin_load_window)); return; } - + equalizerwin_create_list_window(equalizer_presets, Q_("Load preset"), &equalizerwin_load_window, @@ -1325,11 +1129,9 @@ { gint i; - ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, 0); - for (i = 0; i < 10; i++) - ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], 0); - - equalizerwin_eq_changed(); + equalizerwin_set_preamp(0); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + equalizerwin_set_band(i, 0); } void @@ -1342,7 +1144,9 @@ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog)); - load_preset_file(file_uri); + EqualizerPreset *preset = aud_load_preset_file(file_uri); + equalizerwin_apply_preset(preset); + equalizer_preset_free(preset); g_free(file_uri); } gtk_widget_destroy(dialog); @@ -1438,12 +1242,19 @@ gchar *file_uri; gchar *songname; Playlist *playlist = aud_playlist_get_active(); + gint i; dialog = make_filebrowser(Q_("Save equalizer preset"), TRUE); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog)); - save_preset_file(file_uri); + EqualizerPreset *preset = g_new0(EqualizerPreset, 1); + preset->name = g_strdup(file_uri); + preset->preamp = equalizerwin_get_preamp(); + for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) + preset->bands[i] = equalizerwin_get_band(i); + aud_save_preset_file(preset, file_uri); + equalizer_preset_free(preset); g_free(file_uri); } @@ -1511,10 +1322,9 @@ } void -equalizer_activate(gboolean active) +equalizerwin_activate(gboolean active) { aud_cfg->equalizer_active = active; ui_skinned_button_set_inside(equalizerwin_on, active); - equalizerwin_eq_changed(); } diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_equalizer.h --- a/src/skins/ui_equalizer.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/ui_equalizer.h Sat Jul 12 03:39:55 2008 +0300 @@ -64,6 +64,6 @@ extern GtkWidget *equalizerwin_graph; extern gboolean equalizerwin_focus; -void equalizer_activate(gboolean active); +void equalizerwin_activate(gboolean active); #endif /* AUDACIOUS_UI_EQUALIZER_H */ diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_main.c --- a/src/skins/ui_main.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/ui_main.c Sat Jul 12 03:39:55 2008 +0300 @@ -68,7 +68,6 @@ #include "ui_dock.h" #include "ui_main_evlisteners.h" #include "ui_skinselector.h" -#include "ui_urlopener.h" #include "util.h" #include "visualization.h" #endif @@ -1073,30 +1072,6 @@ } static void -on_add_url_add_clicked(GtkWidget * widget, - GtkWidget * entry) -{ - const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry)); - if (text && *text) - aud_playlist_add_url(aud_playlist_get_active(), text); -} - -static void -on_add_url_ok_clicked(GtkWidget * widget, - GtkWidget * entry) -{ - Playlist *playlist = aud_playlist_get_active(); - - const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry)); - if (text && *text) - { - aud_playlist_clear(playlist); - aud_playlist_add_url(playlist, text); - audacious_drct_initiate(); - } -} - -static void on_visibility_warning_toggle(GtkToggleButton *tbt, gpointer unused) { config.warn_about_win_visibility = !gtk_toggle_button_get_active(tbt); @@ -1220,28 +1195,6 @@ g_free(theme); } -void -mainwin_show_add_url_window(void) -{ -#if 0 - static GtkWidget *url_window = NULL; - - if (!url_window) { - url_window = - util_add_url_dialog_new(_("Enter location to play:"), - G_CALLBACK(on_add_url_ok_clicked), - G_CALLBACK(on_add_url_add_clicked)); - gtk_window_set_transient_for(GTK_WINDOW(url_window), - GTK_WINDOW(mainwin)); - g_signal_connect(url_window, "destroy", - G_CALLBACK(gtk_widget_destroyed), - &url_window); - } - - gtk_window_present(GTK_WINDOW(url_window)); -#endif -} - static void check_set( GtkActionGroup * action_group , const gchar * action_name , @@ -1749,7 +1702,7 @@ break; } case MAINWIN_GENERAL_PLAYLOCATION: - mainwin_show_add_url_window(); + action_play_location(); break; case MAINWIN_GENERAL_FILEINFO: aud_playlist_fileinfo_current(playlist); @@ -2756,7 +2709,7 @@ void action_play_location( void ) { - mainwin_show_add_url_window(); + aud_hook_call("urlopener show", NULL); } void diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_main.h --- a/src/skins/ui_main.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/ui_main.h Sat Jul 12 03:39:55 2008 +0300 @@ -155,7 +155,6 @@ void mainwin_repeat_pushed(gboolean toggled); void mainwin_disable_seekbar(void); void mainwin_set_title(const gchar * text); -void mainwin_show_add_url_window(void); void mainwin_minimize_cb(void); void mainwin_general_menu_callback(gpointer cb_data, guint action, diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_playlist.c --- a/src/skins/ui_playlist.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/skins/ui_playlist.c Sat Jul 12 03:39:55 2008 +0300 @@ -54,9 +54,7 @@ #include "ui_main.h" #include "ui_manager.h" #include "ui_playlist_evlisteners.h" -#if 0 #include "ui_playlist_manager.h" -#endif #include "util.h" #include "ui_skinned_window.h" @@ -1201,7 +1199,7 @@ break; case GDK_Insert: if (event->state & GDK_MOD1_MASK) - mainwin_show_add_url_window(); + action_playlist_add_url(); else playlistwin_show_filebrowser(); break; @@ -1802,7 +1800,7 @@ void action_playlist_add_url(void) { - mainwin_show_add_url_window(); + aud_hook_call("urlopener show", NULL); } void @@ -1869,9 +1867,7 @@ void action_open_list_manager(void) { -#if 0 playlist_manager_ui_show(); -#endif } void diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_playlist_manager.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/skins/ui_playlist_manager.c Sat Jul 12 03:39:55 2008 +0300 @@ -0,0 +1,498 @@ +/* Audacious - Cross-platform multimedia player + * Copyright (C) 2005-2007 Audacious development team. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * The Audacious team does not consider modular code linking to + * Audacious or using our public API to be a derived work. + */ + +#include "ui_playlist_manager.h" +#include "ui_playlist.h" +#include +#include "ui_main.h" + +#include +#include +#include +#include + + +#define DISABLE_MANAGER_UPDATE() g_object_set_data(G_OBJECT(listview),"opt1",GINT_TO_POINTER(1)) +#define ENABLE_MANAGER_UPDATE() g_object_set_data(G_OBJECT(listview),"opt1",GINT_TO_POINTER(0)) + + +static GtkWidget *playman_win = NULL; + + +/* in this enum, place the columns according to visualization order + (information not displayed in columns should be placed right before PLLIST_NUMCOLS) */ +enum +{ + PLLIST_COL_NAME = 0, + PLLIST_COL_ENTRIESNUM, + PLLIST_PLPOINTER, + PLLIST_TEXT_WEIGHT, + PLLIST_NUMCOLS +}; + + +static GtkTreeIter +playlist_manager_populate ( GtkListStore * store ) +{ + GList *playlists = NULL; + Playlist *active, *iter_playlist, *next_playlist; + GtkTreeIter iter, insert, next, active_iter; + gboolean valid, have_active_iter; + + active = aud_playlist_get_active(); + playlists = aud_playlist_get_playlists(); + valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store) , &iter ); + have_active_iter = FALSE; + while ( playlists != NULL ) + { + GList *entries = NULL; + gint entriesnum = 0; + gchar *pl_name = NULL; + Playlist *playlist = (Playlist*)playlists->data; + + if(playlist != active) //XXX the active playlist has been locked in playlist_new_from_selected() + PLAYLIST_LOCK(playlist); + + /* for each playlist, pick name and number of entries */ + pl_name = (gchar*)aud_playlist_get_current_name( playlist ); + for (entries = playlist->entries; entries; entries = g_list_next(entries)) + entriesnum++; + + if(playlist != active) + PLAYLIST_UNLOCK(playlist); + + /* update the tree model conservatively */ + + if ( !valid ) + { + /* append */ + gtk_list_store_append( store , &insert ); + goto store_set; + } + + gtk_tree_model_get( GTK_TREE_MODEL(store) , &iter , + PLLIST_PLPOINTER , &iter_playlist , -1 ); + + if ( playlist == iter_playlist ) + { + /* already have - just update */ + insert = iter; + valid = gtk_tree_model_iter_next( GTK_TREE_MODEL(store) , &iter ); + goto store_set; + } + + /* handle movement/deletion/insertion of single elements */ + if ( gtk_tree_model_iter_next( GTK_TREE_MODEL(store) , &next ) ) + { + gtk_tree_model_get( GTK_TREE_MODEL(store) , &next , + PLLIST_PLPOINTER , &next_playlist , -1 ); + if ( playlist == next_playlist ) + { + /* remove */ + gtk_list_store_remove( store , &iter ); + iter = next; + valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter); + goto next_playlist; + } + } + + /* insert */ + gtk_list_store_insert_before( store , &insert , &iter ); + +store_set: + gtk_list_store_set( store, &insert, + PLLIST_COL_NAME , pl_name , + PLLIST_COL_ENTRIESNUM , entriesnum , + PLLIST_PLPOINTER , playlist , + PLLIST_TEXT_WEIGHT , playlist == active ? + PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL , + -1 ); + if ( !have_active_iter && playlist == active ) + { + active_iter = insert; + have_active_iter = TRUE; + } + +next_playlist: + playlists = g_list_next(playlists); + } + + while (valid) + { + /* remove any other elements */ + next = iter; + valid = gtk_tree_model_iter_next( GTK_TREE_MODEL(store) , &next ); + gtk_list_store_remove( store , &iter ); + iter = next; + } + + if ( !have_active_iter ) + gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store) , &active_iter ); + + return active_iter; +} + + +static void +playlist_manager_cb_new ( gpointer listview ) +{ + GList *playlists = NULL; + Playlist *newpl = NULL; + GtkTreeIter iter; + GtkListStore *store; + gchar *pl_name = NULL; + + /* this ensures that playlist_manager_update() will + not perform update, since we're already doing it here */ + DISABLE_MANAGER_UPDATE(); + + newpl = aud_playlist_new(); + pl_name = (gchar*)aud_playlist_get_current_name( newpl ); + playlists = aud_playlist_get_playlists(); + aud_playlist_add_playlist( newpl ); + + store = (GtkListStore*)gtk_tree_view_get_model( GTK_TREE_VIEW(listview) ); + gtk_list_store_append( store , &iter ); + gtk_list_store_set( store, &iter, + PLLIST_COL_NAME , pl_name , + PLLIST_COL_ENTRIESNUM , 0 , + PLLIST_PLPOINTER , newpl , + PLLIST_TEXT_WEIGHT , PANGO_WEIGHT_NORMAL , + -1 ); + + ENABLE_MANAGER_UPDATE(); + + return; +} + + +static void +playlist_manager_cb_del ( gpointer listview ) +{ + GtkTreeSelection *listsel = gtk_tree_view_get_selection( GTK_TREE_VIEW(listview) ); + GtkTreeModel *store; + GtkTreeIter iter; + Playlist *active; + gboolean was_active; + + if ( gtk_tree_selection_get_selected( listsel , &store , &iter ) == TRUE ) + { + Playlist *playlist = NULL; + gtk_tree_model_get( store, &iter, PLLIST_PLPOINTER , &playlist , -1 ); + + active = aud_playlist_get_active(); + was_active = ( playlist == active ); + + if ( gtk_tree_model_iter_n_children( store , NULL ) < 2 ) + { + /* let playlist_manager_update() handle the deletion of the last playlist */ + aud_playlist_remove_playlist( playlist ); + } + else + { + gtk_list_store_remove( (GtkListStore*)store , &iter ); + /* this ensures that playlist_manager_update() will + not perform update, since we're already doing it here */ + DISABLE_MANAGER_UPDATE(); + aud_playlist_remove_playlist( playlist ); + ENABLE_MANAGER_UPDATE(); + } + + if ( was_active && gtk_tree_model_get_iter_first( store , &iter ) ) + { + /* update bolded playlist */ + active = aud_playlist_get_active(); + do { + gtk_tree_model_get( store , &iter , + PLLIST_PLPOINTER , &playlist , -1 ); + gtk_list_store_set( GTK_LIST_STORE(store) , &iter , + PLLIST_TEXT_WEIGHT , playlist == active ? + PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL , + -1 ); + } while ( gtk_tree_model_iter_next( store , &iter ) ); + } + } + + return; +} + + +static void +playlist_manager_cb_lv_dclick ( GtkTreeView * listview , GtkTreePath * path , + GtkTreeViewColumn * col , gpointer userdata ) +{ + GtkTreeModel *store; + GtkTreeIter iter; + Playlist *playlist = NULL, *active; + + store = gtk_tree_view_get_model( GTK_TREE_VIEW(listview) ); + if ( gtk_tree_model_get_iter( store , &iter , path ) == TRUE ) + { + gtk_tree_model_get( store , &iter , PLLIST_PLPOINTER , &playlist , -1 ); + DISABLE_MANAGER_UPDATE(); + aud_playlist_select_playlist( playlist ); + ENABLE_MANAGER_UPDATE(); + } + + if ( gtk_tree_model_get_iter_first( store , &iter ) ) + { + /* update bolded playlist */ + active = aud_playlist_get_active(); + do { + gtk_tree_model_get( store , &iter , + PLLIST_PLPOINTER , &playlist , -1 ); + gtk_list_store_set( GTK_LIST_STORE(store) , &iter , + PLLIST_TEXT_WEIGHT , playlist == active ? + PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL , + -1 ); + } while ( gtk_tree_model_iter_next( store , &iter ) ); + } + + return; +} + + +static void +playlist_manager_cb_lv_pmenu_rename ( GtkMenuItem *menuitem , gpointer lv ) +{ + GtkTreeSelection *listsel = gtk_tree_view_get_selection( GTK_TREE_VIEW(lv) ); + GtkTreeModel *store; + GtkTreeIter iter; + + if ( gtk_tree_selection_get_selected( listsel , &store , &iter ) == TRUE ) + { + GtkTreePath *path = gtk_tree_model_get_path( GTK_TREE_MODEL(store) , &iter ); + GtkCellRenderer *rndrname = g_object_get_data( G_OBJECT(lv) , "rn" ); + /* set the name renderer to editable and start editing */ + g_object_set( G_OBJECT(rndrname) , "editable" , TRUE , NULL ); + gtk_tree_view_set_cursor_on_cell( GTK_TREE_VIEW(lv) , path , + gtk_tree_view_get_column( GTK_TREE_VIEW(lv) , PLLIST_COL_NAME ) , rndrname , TRUE ); + gtk_tree_path_free( path ); + } +} + +static void +playlist_manager_cb_lv_name_edited ( GtkCellRendererText *cell , gchar *path_string , + gchar *new_text , gpointer listview ) +{ + /* this is currently used to change playlist names */ + GtkTreeModel *store = gtk_tree_view_get_model( GTK_TREE_VIEW(listview) ); + GtkTreeIter iter; + + if ( gtk_tree_model_get_iter_from_string( store , &iter , path_string ) == TRUE ) + { + Playlist *playlist = NULL; + gtk_tree_model_get( GTK_TREE_MODEL(store), &iter, PLLIST_PLPOINTER , &playlist , -1 ); + DISABLE_MANAGER_UPDATE(); + aud_playlist_set_current_name( playlist , new_text ); + ENABLE_MANAGER_UPDATE(); + gtk_list_store_set( GTK_LIST_STORE(store), &iter, PLLIST_COL_NAME , new_text , -1 ); + } + /* set the renderer uneditable again */ + g_object_set( G_OBJECT(cell) , "editable" , FALSE , NULL ); +} + + +static gboolean +playlist_manager_cb_lv_btpress ( GtkWidget *lv , GdkEventButton *event ) +{ + if (( event->type == GDK_BUTTON_PRESS ) && ( event->button == 3 )) + { + GtkWidget *pmenu = (GtkWidget*)g_object_get_data( G_OBJECT(lv) , "menu" ); + gtk_menu_popup( GTK_MENU(pmenu) , NULL , NULL , NULL , NULL , + (event != NULL) ? event->button : 0, + event->time); + return TRUE; + } + + return FALSE; +} + + +static gboolean +playlist_manager_cb_keypress ( GtkWidget *win , GdkEventKey *event ) +{ + switch (event->keyval) + { + case GDK_Escape: + gtk_widget_destroy( playman_win ); + return TRUE; + default: + return FALSE; + } +} + + +void +playlist_manager_ui_show ( void ) +{ + GtkWidget *playman_vbox; + GtkWidget *playman_pl_lv, *playman_pl_lv_frame, *playman_pl_lv_sw; + GtkCellRenderer *playman_pl_lv_textrndr_name, *playman_pl_lv_textrndr_entriesnum; + GtkTreeViewColumn *playman_pl_lv_col_name, *playman_pl_lv_col_entriesnum; + GtkListStore *pl_store; + GtkWidget *playman_pl_lv_pmenu, *playman_pl_lv_pmenu_rename; + GtkWidget *playman_bbar_hbbox; + GtkWidget *playman_bbar_bt_new, *playman_bbar_bt_del, *playman_bbar_bt_close; + GdkGeometry playman_win_hints; + GtkTreeIter active_iter; + GtkTreePath *active_path; + + if ( playman_win != NULL ) + { + gtk_window_present( GTK_WINDOW(playman_win) ); + return; + } + + playman_win = gtk_window_new( GTK_WINDOW_TOPLEVEL ); + gtk_window_set_type_hint( GTK_WINDOW(playman_win), GDK_WINDOW_TYPE_HINT_DIALOG ); + gtk_window_set_transient_for( GTK_WINDOW(playman_win) , GTK_WINDOW(mainwin) ); + gtk_window_set_position( GTK_WINDOW(playman_win), GTK_WIN_POS_CENTER ); + gtk_window_set_title( GTK_WINDOW(playman_win), _("Playlist Manager") ); + gtk_container_set_border_width( GTK_CONTAINER(playman_win), 10 ); + g_signal_connect( G_OBJECT(playman_win) , "destroy" , + G_CALLBACK(gtk_widget_destroyed) , &playman_win ); + g_signal_connect( G_OBJECT(playman_win) , "key-press-event" , + G_CALLBACK(playlist_manager_cb_keypress) , NULL ); + playman_win_hints.min_width = 400; + playman_win_hints.min_height = 250; + gtk_window_set_geometry_hints( GTK_WINDOW(playman_win) , GTK_WIDGET(playman_win) , + &playman_win_hints , GDK_HINT_MIN_SIZE ); + + playman_vbox = gtk_vbox_new( FALSE , 10 ); + gtk_container_add( GTK_CONTAINER(playman_win) , playman_vbox ); + + /* current liststore model + ---------------------------------------------- + G_TYPE_STRING -> playlist name + G_TYPE_UINT -> number of entries in playlist + G_TYPE_POINTER -> playlist pointer (Playlist*) + PANGO_TYPE_WEIGHT -> font weight + ---------------------------------------------- + */ + pl_store = gtk_list_store_new( PLLIST_NUMCOLS , + G_TYPE_STRING , G_TYPE_UINT , G_TYPE_POINTER , PANGO_TYPE_WEIGHT ); + active_iter = playlist_manager_populate( pl_store ); + + playman_pl_lv_frame = gtk_frame_new( NULL ); + playman_pl_lv = gtk_tree_view_new_with_model( GTK_TREE_MODEL(pl_store) ); + + g_object_set_data( G_OBJECT(playman_win) , "lv" , playman_pl_lv ); + g_object_set_data( G_OBJECT(playman_pl_lv) , "opt1" , GINT_TO_POINTER(0) ); + playman_pl_lv_textrndr_entriesnum = gtk_cell_renderer_text_new(); /* uneditable */ + playman_pl_lv_textrndr_name = gtk_cell_renderer_text_new(); /* can become editable */ + g_object_set( G_OBJECT(playman_pl_lv_textrndr_entriesnum) , "weight-set" , TRUE , NULL ); + g_object_set( G_OBJECT(playman_pl_lv_textrndr_name) , "weight-set" , TRUE , NULL ); + g_signal_connect( G_OBJECT(playman_pl_lv_textrndr_name) , "edited" , + G_CALLBACK(playlist_manager_cb_lv_name_edited) , playman_pl_lv ); + g_object_set_data( G_OBJECT(playman_pl_lv) , "rn" , playman_pl_lv_textrndr_name ); + playman_pl_lv_col_name = gtk_tree_view_column_new_with_attributes( + _("Playlist") , playman_pl_lv_textrndr_name , + "text" , PLLIST_COL_NAME , + "weight", PLLIST_TEXT_WEIGHT , + NULL ); + gtk_tree_view_column_set_expand( GTK_TREE_VIEW_COLUMN(playman_pl_lv_col_name) , TRUE ); + gtk_tree_view_append_column( GTK_TREE_VIEW(playman_pl_lv), playman_pl_lv_col_name ); + playman_pl_lv_col_entriesnum = gtk_tree_view_column_new_with_attributes( + _("Entries") , playman_pl_lv_textrndr_entriesnum , + "text" , PLLIST_COL_ENTRIESNUM , + "weight", PLLIST_TEXT_WEIGHT , + NULL ); + gtk_tree_view_column_set_expand( GTK_TREE_VIEW_COLUMN(playman_pl_lv_col_entriesnum) , FALSE ); + gtk_tree_view_append_column( GTK_TREE_VIEW(playman_pl_lv), playman_pl_lv_col_entriesnum ); + playman_pl_lv_sw = gtk_scrolled_window_new( NULL , NULL ); + gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(playman_pl_lv_sw) , + GTK_POLICY_NEVER , GTK_POLICY_ALWAYS ); + gtk_container_add( GTK_CONTAINER(playman_pl_lv_sw) , playman_pl_lv ); + gtk_container_add( GTK_CONTAINER(playman_pl_lv_frame) , playman_pl_lv_sw ); + gtk_box_pack_start( GTK_BOX(playman_vbox) , playman_pl_lv_frame , TRUE , TRUE , 0 ); + + /* listview popup menu */ + playman_pl_lv_pmenu = gtk_menu_new(); + playman_pl_lv_pmenu_rename = gtk_menu_item_new_with_mnemonic( _( "_Rename" ) ); + g_signal_connect( G_OBJECT(playman_pl_lv_pmenu_rename) , "activate" , + G_CALLBACK(playlist_manager_cb_lv_pmenu_rename) , playman_pl_lv ); + gtk_menu_shell_append( GTK_MENU_SHELL(playman_pl_lv_pmenu) , playman_pl_lv_pmenu_rename ); + gtk_widget_show_all( playman_pl_lv_pmenu ); + g_object_set_data( G_OBJECT(playman_pl_lv) , "menu" , playman_pl_lv_pmenu ); + g_signal_connect_swapped( G_OBJECT(playman_win) , "destroy" , + G_CALLBACK(gtk_widget_destroy) , playman_pl_lv_pmenu ); + + /* button bar */ + playman_bbar_hbbox = gtk_hbutton_box_new(); + gtk_button_box_set_layout( GTK_BUTTON_BOX(playman_bbar_hbbox) , GTK_BUTTONBOX_END ); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(playman_bbar_hbbox), 5); + playman_bbar_bt_close = gtk_button_new_from_stock( GTK_STOCK_CLOSE ); + playman_bbar_bt_del = gtk_button_new_from_stock( GTK_STOCK_DELETE ); + playman_bbar_bt_new = gtk_button_new_from_stock( GTK_STOCK_NEW ); + gtk_container_add( GTK_CONTAINER(playman_bbar_hbbox) , playman_bbar_bt_close ); + gtk_container_add( GTK_CONTAINER(playman_bbar_hbbox) , playman_bbar_bt_del ); + gtk_container_add( GTK_CONTAINER(playman_bbar_hbbox) , playman_bbar_bt_new ); + gtk_button_box_set_child_secondary( GTK_BUTTON_BOX(playman_bbar_hbbox) , + playman_bbar_bt_close , TRUE ); + gtk_box_pack_start( GTK_BOX(playman_vbox) , playman_bbar_hbbox , FALSE , FALSE , 0 ); + + g_signal_connect( G_OBJECT(playman_pl_lv) , "button-press-event" , + G_CALLBACK(playlist_manager_cb_lv_btpress) , NULL ); + g_signal_connect( G_OBJECT(playman_pl_lv) , "row-activated" , + G_CALLBACK(playlist_manager_cb_lv_dclick) , NULL ); + g_signal_connect_swapped( G_OBJECT(playman_bbar_bt_new) , "clicked" , + G_CALLBACK(playlist_manager_cb_new) , playman_pl_lv ); + g_signal_connect_swapped( G_OBJECT(playman_bbar_bt_del) , "clicked" , + G_CALLBACK(playlist_manager_cb_del) , playman_pl_lv ); + g_signal_connect_swapped( G_OBJECT(playman_bbar_bt_close) , "clicked" , + G_CALLBACK(gtk_widget_destroy) , playman_win ); + + /* have active playlist selected and scrolled to */ + active_path = gtk_tree_model_get_path( GTK_TREE_MODEL(pl_store) , + &active_iter ); + gtk_tree_view_set_cursor( GTK_TREE_VIEW(playman_pl_lv) , + active_path , NULL , FALSE ); + gtk_tree_view_scroll_to_cell( GTK_TREE_VIEW(playman_pl_lv) , + active_path , NULL , TRUE , 0.5 , 0.0 ); + gtk_tree_path_free( active_path ); + + g_object_unref( pl_store ); + + gtk_widget_show_all( playman_win ); +} + + +void +playlist_manager_update ( void ) +{ + /* this function is called whenever there is a change in playlist, such as + playlist created/deleted or entry added/deleted in a playlist; if the playlist + manager is active, it should be updated to keep consistency of information */ + + /* CAREFUL! this currently locks/unlocks all the playlists */ + + if ( playman_win != NULL ) + { + GtkWidget *lv = (GtkWidget*)g_object_get_data( G_OBJECT(playman_win) , "lv" ); + if ( GPOINTER_TO_INT(g_object_get_data(G_OBJECT(lv),"opt1")) == 0 ) + { + GtkListStore *store = (GtkListStore*)gtk_tree_view_get_model( GTK_TREE_VIEW(lv) ); + playlist_manager_populate( store ); + } + return; + } + else + return; /* if the playlist manager is not active, simply return */ +} diff -r 2d3594eaa18a -r 9e06acde819e src/skins/ui_playlist_manager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/skins/ui_playlist_manager.h Sat Jul 12 03:39:55 2008 +0300 @@ -0,0 +1,26 @@ +/* Audacious - Cross-platform multimedia player + * Copyright (C) 2005-2007 Audacious development team. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * The Audacious team does not consider modular code linking to + * Audacious or using our public API to be a derived work. + */ + +#ifndef AUDACIOUS_UI_PLAYLIST_MANAGER_H +#define AUDACIOUS_UI_PLAYLIST_MANAGER_H + +void playlist_manager_update ( void ); +void playlist_manager_ui_show ( void ); + +#endif /* AUDACIOUS_UI_PLAYLIST_MANAGER_H */ diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/Makefile --- a/src/streambrowser/Makefile Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/Makefile Sat Jul 12 03:39:55 2008 +0300 @@ -6,7 +6,9 @@ gui/about_win.c \ gui/streambrowser_win.c -DATA = images/shoutcast.png +DATA = images/shoutcast.png \ + images/streambrowser-16x16.png \ + images/streambrowser-64x64.png include ../../buildsys.mk include ../../extra.mk diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/gui/streambrowser_win.c --- a/src/streambrowser/gui/streambrowser_win.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/gui/streambrowser_win.c Sat Jul 12 03:39:55 2008 +0300 @@ -1,7 +1,10 @@ +#include #include +#include #include #include +#include #include "../streambrowser.h" #include "streambrowser_win.h" @@ -9,14 +12,14 @@ typedef struct { - streamdir_t* streamdir; + streamdir_t* streamdir; GtkWidget* table; GtkWidget* tree_view; } streamdir_gui_t; -void (* update_function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo); +void (* update_function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo); static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text); static GtkWidget* gtk_streamdir_tree_view_new(); @@ -25,10 +28,17 @@ static gboolean on_notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data); static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data); static gboolean on_add_button_clicked(GtkButton *button, gpointer data); +static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); +static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); +static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data); -static streamdir_gui_t* find_streamdir_gui_by_name(gchar *name); -static streamdir_gui_t* find_streamdir_gui_by_tree_view(GtkTreeView *tree_view); -static streamdir_gui_t* find_streamdir_gui_by_table(GtkTable *table); +static streamdir_gui_t* find_streamdir_gui_by_name(gchar *name); +static streamdir_gui_t* find_streamdir_gui_by_tree_view(GtkTreeView *tree_view); +static streamdir_gui_t* find_streamdir_gui_by_table(GtkTable *table); +static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir); +static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data); + +static gboolean mystrcasestr(const char *haystack, const char *needle); static GtkWidget* notebook; @@ -36,8 +46,8 @@ static GtkWidget* add_button; static GtkWidget* streambrowser_window; static GList* streamdir_gui_list; -static GtkCellRenderer* cell_renderer_pixbuf; -static GtkCellRenderer* cell_renderer_text; +static GtkCellRenderer* cell_renderer_pixbuf; +static GtkCellRenderer* cell_renderer_text; void streambrowser_win_init() @@ -52,6 +62,7 @@ /* search entry */ search_entry = gtk_entry_new(); + g_signal_connect(G_OBJECT(search_entry), "key-press-event", G_CALLBACK(on_search_entry_key_pressed), NULL); gtk_widget_show(search_entry); GtkWidget *hbox1 = gtk_hbox_new(FALSE, 0); @@ -75,12 +86,12 @@ gtk_window_set_title(GTK_WINDOW(streambrowser_window), _("Stream browser")); gtk_window_set_position(GTK_WINDOW(streambrowser_window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(streambrowser_window), 700, 400); + gtk_window_set_icon_from_file(GTK_WINDOW(streambrowser_window), STREAMBROWSER_ICON, NULL); g_signal_connect(G_OBJECT(streambrowser_window), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), streambrowser_window); gtk_container_add(GTK_CONTAINER(streambrowser_window), vbox1); /* others */ cell_renderer_pixbuf = gtk_cell_renderer_pixbuf_new(); - g_object_set(G_OBJECT(cell_renderer_pixbuf), "stock-id", "gtk-directory", NULL); cell_renderer_text = gtk_cell_renderer_text_new(); } @@ -142,7 +153,7 @@ category = category_get_by_index(streamdir, i); gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, 0, NULL, 1, category->name, 2, "", -1); + gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", -1); } } @@ -178,7 +189,7 @@ streaminfo = streaminfo_get_by_index(category, i); gtk_tree_store_append(store, &new_iter, &iter); - gtk_tree_store_set(store, &new_iter, 0, NULL, 1, streaminfo->name, 2, streaminfo->current_track, -1); + gtk_tree_store_set(store, &new_iter, 0, "gtk-directory", 1, streaminfo->name, 2, streaminfo->current_track, -1); } } @@ -187,6 +198,52 @@ update_function = function; } +void streambrowser_win_set_category_state(streamdir_t *streamdir, category_t *category, gboolean fetching) +{ + streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_streamdir(streamdir); + GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(tree_view)); + GtkTreePath *path; + GtkTreeIter iter; + + /* find the corresponding category tree iter */ + path = gtk_tree_path_new_from_indices(category_get_index(streamdir, category), -1); + if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) + return; + + if (fetching) { + gchar temp[DEF_STRING_LEN]; + sprintf(temp, "%s", category->name); + gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, "", -1); + } + else { + gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, category->name, 2, "", -1); + } +} + +void streambrowser_win_set_streaminfo_state(streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo, gboolean fetching) +{ + streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_streamdir(streamdir); + GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); + GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(tree_view)); + GtkTreePath *path; + GtkTreeIter iter; + + /* find the corresponding category tree iter */ + path = gtk_tree_path_new_from_indices(category_get_index(streamdir, category), streaminfo_get_index(category, streaminfo), -1); + if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) + return; + + if (fetching) { + gchar temp[DEF_STRING_LEN]; + sprintf(temp, "%s", streaminfo->name); + gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, "", -1); + } + else { + gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, streaminfo->name, 2, "", -1); + } +} + static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text) { GtkWidget *hbox = gtk_hbox_new(FALSE, 1); @@ -203,20 +260,36 @@ { GtkWidget *tree_view = gtk_tree_view_new(); - GtkTreeStore *store = gtk_tree_store_new(3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); + GtkTreeStore *store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(store)); - // todo: why doesn't the tree view allow to be resized? gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE); - gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(tree_view), TRUE); - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(tree_view), TRUE); - gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(tree_view), FALSE); + gtk_tree_view_set_search_entry(GTK_TREE_VIEW(tree_view), GTK_ENTRY(search_entry)); + gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(tree_view), tree_view_search_equal_func, NULL, NULL); + gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree_view), 1); + g_signal_connect(G_OBJECT(tree_view), "key-press-event", G_CALLBACK(on_tree_view_key_pressed), NULL); + g_signal_connect(G_OBJECT(tree_view), "cursor-changed", G_CALLBACK(on_tree_view_cursor_changed), NULL); + g_signal_connect(G_OBJECT(tree_view), "button-press-event", G_CALLBACK(on_tree_view_button_pressed), NULL); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(tree_view), -1, "", cell_renderer_pixbuf, "pixbuf", 0, NULL); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(tree_view), -1, _("Stream name"), cell_renderer_text, "text", 1, NULL); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(tree_view), -1, _("Now playing"), cell_renderer_text, "text", 2, NULL); + GtkTreeViewColumn *column = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(column, cell_renderer_pixbuf, TRUE); + gtk_tree_view_column_add_attribute(column, cell_renderer_pixbuf, "stock-id", 0); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(column, cell_renderer_text, TRUE); + gtk_tree_view_column_add_attribute(column, cell_renderer_text, "markup", 1); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_title(column, _("Stream name")); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); - g_signal_connect(G_OBJECT(tree_view), "cursor-changed", G_CALLBACK(on_tree_view_cursor_changed), NULL); + column = gtk_tree_view_column_new(); + gtk_tree_view_column_pack_start(column, cell_renderer_text, TRUE); + gtk_tree_view_column_add_attribute(column, cell_renderer_text, "text", 2); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_title(column, _("Now playing")); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); return tree_view; } @@ -253,10 +326,11 @@ static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data) { GtkTreePath *path; - GtkTreeViewColumn *focus_column; + GtkTreeIter iter; + GtkTreeModel *model; /* obtain the current category */ - gtk_tree_view_get_cursor(tree_view, &path, &focus_column); + gtk_tree_view_get_cursor(tree_view, &path, NULL); if (path == NULL) return TRUE; @@ -267,6 +341,14 @@ return TRUE; } + model = gtk_tree_view_get_model(tree_view); + gtk_tree_model_get_iter(model, &iter, path); + + if (gtk_tree_model_iter_has_child(model, &iter)) { + gtk_tree_path_free(path); + return TRUE; + } + int category_index = indices[0]; gtk_tree_path_free(path); @@ -278,10 +360,17 @@ /* issue an update on the current category */ update_function(streamdir_gui->streamdir, category_get_by_index(streamdir_gui->streamdir, category_index), NULL); - /* clear the search box */ - gtk_entry_set_text(GTK_ENTRY(search_entry), ""); + return TRUE; +} - return TRUE; +static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data) +{ + /* double click adds the currently selected stream to the playlist */ + if (event->type == GDK_2BUTTON_PRESS) { + on_add_button_clicked(NULL, NULL); + } + + return FALSE; } static gboolean on_add_button_clicked(GtkButton *button, gpointer data) @@ -294,15 +383,20 @@ if (streamdir_gui == NULL) return TRUE; - GtkWidget *tree_view = streamdir_gui->tree_view; + GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); - gtk_tree_view_get_cursor(GTK_TREE_VIEW(tree_view), &path, &focus_column); + gtk_tree_view_get_cursor(tree_view, &path, &focus_column); if (path == NULL) return TRUE; gint *indices = gtk_tree_path_get_indices(path); - if (gtk_tree_path_get_depth(path) != 2) { + if (gtk_tree_path_get_depth(path) == 1) { + if (gtk_tree_view_row_expanded(tree_view, path)) + gtk_tree_view_collapse_row(tree_view, path); + else + gtk_tree_view_expand_row(tree_view, path, FALSE); + gtk_tree_path_free(path); return TRUE; } @@ -316,11 +410,70 @@ category_t *category = category_get_by_index(streamdir_gui->streamdir, category_index); streaminfo_t *streaminfo = streaminfo_get_by_index(category, streaminfo_index); + gtk_entry_set_text(GTK_ENTRY(search_entry), ""); update_function(streamdir, category, streaminfo); return TRUE; } +static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) { + on_add_button_clicked(GTK_BUTTON(add_button), NULL); + return FALSE; + } + + if (event->keyval == GDK_Escape) { + gtk_entry_set_text(GTK_ENTRY(search_entry), ""); + return FALSE; + } + + /* todo : remove this + GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); + streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); + if (streamdir_gui == NULL) + return FALSE; + + GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); + GtkTreeModel *model = gtk_tree_view_get_model(tree_view); + GtkTreeIter iter; + GtkTreePath *path; + const gchar *key = gtk_entry_get_text(GTK_ENTRY(search_entry)); + + if (!gtk_tree_model_get_iter_first(model, &iter)) + return FALSE; + + while (gtk_tree_model_iter_next(model, &iter)) { + GValue value = {0, }; + + gtk_tree_model_get_value(model, &iter, 1, &value); + const gchar *string = g_value_get_string(&value); + + if (string == NULL || string[0] == '\0' || key == NULL || key[0] == '\0') + return FALSE; + + if (mystrcasestr(string, key)) { gtk_entry_set_text(GTK_ENTRY(search_entry), ""); + + path = gtk_tree_model_get_path(model, &iter); + gtk_tree_view_set_cursor(tree_view, path, NULL, FALSE); + gtk_tree_path_free(path); + } + + g_value_unset(&value); + } + */ + + return FALSE; +} + +static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + gtk_widget_grab_focus(search_entry); + on_search_entry_key_pressed(widget, event, data); + + return FALSE; +} + static streamdir_gui_t *find_streamdir_gui_by_name(gchar *name) { GList *iterator; @@ -366,3 +519,58 @@ return NULL; } +static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir) +{ + GList *iterator; + streamdir_gui_t *streamdir_gui; + + for (iterator = g_list_first(streamdir_gui_list); iterator != NULL; iterator = g_list_next(iterator)) { + streamdir_gui = iterator->data; + + if ((void *) streamdir_gui->streamdir == (void *) streamdir) + return streamdir_gui; + } + + return NULL; +} + +static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data) +{ + GValue value = {0, }; + gboolean ret; + + gtk_tree_model_get_value(model, iter, column, &value); + const gchar *string = g_value_get_string(&value); + + if (string == NULL || string[0] == '\0' || key == NULL || key[0] == '\0') + ret = TRUE; + + ret = !mystrcasestr(string, key); + + g_value_unset(&value); + + return ret; +} + +static gboolean mystrcasestr(const char *haystack, const char *needle) +{ + int len_h = strlen(haystack) + 1; + int len_n = strlen(needle) + 1; + int i; + + char *upper_h = malloc(len_h); + char *upper_n = malloc(len_n); + + for (i = 0; i < len_h; i++) + upper_h[i] = toupper(haystack[i]); + for (i = 0; i < len_n; i++) + upper_n[i] = toupper(needle[i]); + + char *p = strstr(upper_h, upper_n); + + free(upper_h); + free(upper_n); + + return (gboolean) p; +} + diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/gui/streambrowser_win.h --- a/src/streambrowser/gui/streambrowser_win.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/gui/streambrowser_win.h Sat Jul 12 03:39:55 2008 +0300 @@ -13,6 +13,8 @@ void streambrowser_win_set_streamdir(streamdir_t *streamdir, gchar *icon_filename); void streambrowser_win_set_category(streamdir_t *streamdir, category_t *category); void streambrowser_win_set_update_function(void (* update_function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo)); +void streambrowser_win_set_category_state(streamdir_t *streamdir, category_t *category, gboolean fetching); +void streambrowser_win_set_streaminfo_state(streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo, gboolean fetching); #endif // STREAMBROWSER_WIN_H diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/images/streambrowser-16x16.png Binary file src/streambrowser/images/streambrowser-16x16.png has changed diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/images/streambrowser-64x64.png Binary file src/streambrowser/images/streambrowser-64x64.png has changed diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/images/streambrowser.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/streambrowser/images/streambrowser.svg Sat Jul 12 03:39:55 2008 +0300 @@ -0,0 +1,251 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/shoutcast.h --- a/src/streambrowser/shoutcast.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/shoutcast.h Sat Jul 12 03:39:55 2008 +0300 @@ -5,16 +5,16 @@ #include "streambrowser.h" #include "streamdir.h" -#define SHOUTCAST_NAME "Shoutcast" -#define SHOUTCAST_ICON DATA_DIR G_DIR_SEPARATOR_S "images" G_DIR_SEPARATOR_S "shoutcast.png" +#define SHOUTCAST_NAME "Shoutcast" +#define SHOUTCAST_ICON DATA_DIR G_DIR_SEPARATOR_S "images" G_DIR_SEPARATOR_S "shoutcast.png" #define SHOUTCAST_STREAMDIR_URL "http://www.shoutcast.com/sbin/newxml.phtml" #define SHOUTCAST_CATEGORY_URL "http://www.shoutcast.com/sbin/newxml.phtml?genre=%s" #define SHOUTCAST_STREAMINFO_URL "http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=%s&file=filename.pls" #define SHOUTCAST_BUFFER_SIZE 256 -gboolean shoutcast_category_fetch(category_t *category); -streamdir_t* shoutcast_streamdir_fetch(); +gboolean shoutcast_category_fetch(category_t *category); +streamdir_t* shoutcast_streamdir_fetch(); #endif // SHOUTCAST_H diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/streambrowser.c --- a/src/streambrowser/streambrowser.c Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/streambrowser.c Sat Jul 12 03:39:55 2008 +0300 @@ -12,51 +12,48 @@ typedef struct { - - streamdir_t* streamdir; - category_t* category; - streaminfo_t* streaminfo; - + streamdir_t *streamdir; + category_t *category; + streaminfo_t *streaminfo; } update_thread_data_t; -static void sb_init(); -static void sb_about(); -static void sb_configure(); -static void sb_cleanup(); +static void sb_init(); +static void sb_about(); +static void sb_configure(); +static void sb_cleanup(); -static void gui_init(); -static void gui_done(); -static void config_load(); -static void config_save(); +static void gui_init(); +static void gui_done(); +static void config_load(); +static void config_save(); -static void streamdir_update(streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo); -static gpointer update_thread_core(update_thread_data_t *data); -static void streaminfo_add_to_playlist(streaminfo_t *streaminfo); -static void on_plugin_services_menu_item_click(); +static void streamdir_update(streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo); +static gpointer update_thread_core(gpointer user_data); +static void streaminfo_add_to_playlist(streaminfo_t *streaminfo); +static void on_plugin_services_menu_item_click(); -static GtkWidget* playlist_menu_item; -static GtkWidget* main_menu_item; -static GQueue* update_thread_data_queue; -static gint update_thread_count = 0; -static GMutex* update_thread_mutex; +static GtkWidget *playlist_menu_item; +static GtkWidget *main_menu_item; +static GQueue *update_thread_data_queue = NULL; +static GMutex *update_thread_mutex = NULL; +static gint update_thread_count = 0; - -streambrowser_cfg_t streambrowser_cfg; +streambrowser_cfg_t streambrowser_cfg; static GeneralPlugin sb_plugin = { - .description = "Stream Browser", - .init = sb_init, - .about = sb_about, - .configure = sb_configure, - .cleanup = sb_cleanup + .description = "Stream Browser", + .init = sb_init, + .about = sb_about, + .configure = sb_configure, + .cleanup = sb_cleanup }; GeneralPlugin *sb_gplist[] = { - &sb_plugin, - NULL + &sb_plugin, + NULL }; SIMPLE_GENERAL_PLUGIN(streambrowser, sb_gplist); @@ -64,292 +61,343 @@ void debug(const char *fmt, ...) { - if (streambrowser_cfg.debug) { - va_list ap; - fprintf(stderr, "* streambrowser: "); - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - } + if (streambrowser_cfg.debug) { + va_list ap; + fprintf(stderr, "* streambrowser: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + } } void failure(const char *fmt, ...) { - va_list ap; - fprintf(stderr, "! streambrowser: "); - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); + va_list ap; + fprintf(stderr, "! streambrowser: "); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); } gboolean fetch_remote_to_local_file(gchar *remote_url, gchar *local_url) { - VFSFile *remote_file = aud_vfs_fopen(remote_url, "r"); - if (remote_file == NULL) { - failure("failed to fetch file '%s'\n", remote_url); - return FALSE; - } - - VFSFile *local_file = aud_vfs_fopen(local_url, "w"); - if (local_file == NULL) { - aud_vfs_fclose(remote_file); - - failure("failed to create local file '%s'\n", local_file); - return FALSE; - } - - unsigned char buff[DEF_BUFFER_SIZE]; - int size; - while (!aud_vfs_feof(remote_file)) { - size = aud_vfs_fread(buff, 1, DEF_BUFFER_SIZE, remote_file); + VFSFile *remote_file = aud_vfs_fopen(remote_url, "r"); + if (remote_file == NULL) { + failure("failed to fetch file '%s'\n", remote_url); + return FALSE; + } + + VFSFile *local_file = aud_vfs_fopen(local_url, "w"); + if (local_file == NULL) { + aud_vfs_fclose(remote_file); + + failure("failed to create local file '%s'\n", local_file); + return FALSE; + } + + unsigned char buff[DEF_BUFFER_SIZE]; + int size; + while (!aud_vfs_feof(remote_file)) { + size = aud_vfs_fread(buff, 1, DEF_BUFFER_SIZE, remote_file); - // i don't know why aud_vfs_feof() doesn't ever return TRUE - // so this is a workaround to properly end the loop - if (size == 0) - break; - - size = aud_vfs_fwrite(buff, 1, size, local_file); - if (size == 0) { - aud_vfs_fclose(local_file); - aud_vfs_fclose(remote_file); + // i don't know why aud_vfs_feof() doesn't ever return TRUE + // so this is a workaround to properly end the loop + if (size == 0) + break; + + size = aud_vfs_fwrite(buff, 1, size, local_file); + if (size == 0) { + aud_vfs_fclose(local_file); + aud_vfs_fclose(remote_file); - failure("failed to write to local file '%s'\n", local_file); - return FALSE; - } - } + failure("failed to write to local file '%s'\n", local_file); + return FALSE; + } + } - aud_vfs_fclose(local_file); - aud_vfs_fclose(remote_file); - - return TRUE; + aud_vfs_fclose(local_file); + aud_vfs_fclose(remote_file); + + return TRUE; } static void sb_init() { - /* workaround to print sb_init() */ - streambrowser_cfg.debug = TRUE; - debug("sb_init()\n"); - streambrowser_cfg.debug = FALSE; + /* workaround to print sb_init() */ + streambrowser_cfg.debug = TRUE; + debug("sb_init()\n"); + streambrowser_cfg.debug = FALSE; - config_load(); - gui_init(); + config_load(); + gui_init(); } static void sb_about() { - debug("sb_about()\n"); + debug("sb_about()\n"); } static void sb_configure() { - debug("sb_configure()\n"); + debug("sb_configure()\n"); } static void sb_cleanup() { - debug("sb_cleanup()\n"); - - gui_done(); - config_save(); + debug("sb_cleanup()\n"); + + gui_done(); + config_save(); } static void gui_init() { - /* the plugin services menu */ - playlist_menu_item = gtk_image_menu_item_new_with_label("Streambrowser"); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(playlist_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU)); - gtk_widget_show(playlist_menu_item); - g_signal_connect(G_OBJECT(playlist_menu_item), "activate", G_CALLBACK(on_plugin_services_menu_item_click), NULL); - audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item); + /* the plugin services menu */ + playlist_menu_item = gtk_image_menu_item_new_with_label(_("Streambrowser")); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(playlist_menu_item), gtk_image_new_from_file(STREAMBROWSER_ICON_SMALL)); + gtk_widget_show(playlist_menu_item); + g_signal_connect(G_OBJECT(playlist_menu_item), "activate", G_CALLBACK(on_plugin_services_menu_item_click), NULL); + audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item); - main_menu_item = gtk_image_menu_item_new_with_label("Streambrowser"); - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU)); - gtk_widget_show(main_menu_item); - g_signal_connect(G_OBJECT(main_menu_item), "activate", G_CALLBACK(on_plugin_services_menu_item_click), NULL); - audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item); + main_menu_item = gtk_image_menu_item_new_with_label(_("Streambrowser")); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(main_menu_item), gtk_image_new_from_file(STREAMBROWSER_ICON_SMALL)); + gtk_widget_show(main_menu_item); + g_signal_connect(G_OBJECT(main_menu_item), "activate", G_CALLBACK(on_plugin_services_menu_item_click), NULL); + audacious_menu_plugin_item_add(AUDACIOUS_MENU_MAIN, main_menu_item); - /* main streambrowser window */ - streambrowser_win_init(); - streambrowser_win_set_update_function(streamdir_update); - - /* others */ - update_thread_mutex = g_mutex_new(); - update_thread_data_queue = g_queue_new(); + /* main streambrowser window */ + streambrowser_win_init(); + streambrowser_win_set_update_function(streamdir_update); - debug("gui initialized\n"); + /* others */ + update_thread_mutex = g_mutex_new(); + update_thread_data_queue = g_queue_new(); + + debug("gui initialized\n"); } static void gui_done() { - /* the plugin services menu */ - audacious_menu_plugin_item_remove(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item); - audacious_menu_plugin_item_remove(AUDACIOUS_MENU_MAIN, main_menu_item); + /* the plugin services menu */ + audacious_menu_plugin_item_remove(AUDACIOUS_MENU_PLAYLIST_RCLICK, playlist_menu_item); + audacious_menu_plugin_item_remove(AUDACIOUS_MENU_MAIN, main_menu_item); + + /* main streambrowser window */ + streambrowser_win_hide(); + streambrowser_win_done(); - /* main streambrowser window */ - streambrowser_win_hide(); - streambrowser_win_done(); - - /* others */ - g_mutex_free(update_thread_mutex); - g_queue_free(update_thread_data_queue); + /* others */ + if (update_thread_mutex) + g_mutex_free(update_thread_mutex); + update_thread_mutex = NULL; + if (update_thread_data_queue) + g_queue_free(update_thread_data_queue); + update_thread_data_queue = NULL; - debug("gui destroied\n"); + debug("gui destroyed\n"); } static void config_load() { - streambrowser_cfg.debug = FALSE; - - mcs_handle_t *db; - if ((db = aud_cfg_db_open()) == NULL) { - failure("failed to load configuration\n"); - return; - } - - aud_cfg_db_get_bool(db, "streambrowser", "debug", &streambrowser_cfg.debug); + streambrowser_cfg.debug = FALSE; - aud_cfg_db_close(db); + mcs_handle_t *db; + if ((db = aud_cfg_db_open()) == NULL) { + failure("failed to load configuration\n"); + return; + } - debug("configuration loaded\n"); - debug("debug = %d\n", streambrowser_cfg.debug); + aud_cfg_db_get_bool(db, "streambrowser", "debug", &streambrowser_cfg.debug); + + aud_cfg_db_close(db); + + debug("configuration loaded\n"); + debug("debug = %d\n", streambrowser_cfg.debug); } static void config_save() { - mcs_handle_t *db; - if ((db = aud_cfg_db_open()) == NULL) { - failure("failed to save configuration\n"); - return; - } + mcs_handle_t *db; + if ((db = aud_cfg_db_open()) == NULL) { + failure("failed to save configuration\n"); + return; + } - aud_cfg_db_set_bool(db, "streambrowser", "debug", streambrowser_cfg.debug); - - aud_cfg_db_close(db); + aud_cfg_db_set_bool(db, "streambrowser", "debug", streambrowser_cfg.debug); - debug("configuration saved\n"); + aud_cfg_db_close(db); + + debug("configuration saved\n"); } static void streamdir_update(streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo) { - debug("requested streamdir update (streamdir = '%s', category = '%s', streaminfo = '%s')\n", - streamdir == NULL ? "" : streamdir->name, - category == NULL ? "" : category->name, - streaminfo == NULL ? "" : streaminfo->name); + debug("requested streamdir update (streamdir = '%s', category = '%s', streaminfo = '%s')\n", + streamdir == NULL ? "" : streamdir->name, + category == NULL ? "" : category->name, + streaminfo == NULL ? "" : streaminfo->name); + + if (update_thread_count >= MAX_UPDATE_THREADS) { + debug("another %d streamdir updates are pending, this request will be dropped\n", update_thread_count); + } + else { + g_mutex_lock(update_thread_mutex); + + /* do we have a running thread? */ + if (update_thread_count > 0) { + int i; + gboolean exists = FALSE; + update_thread_data_t *update_thread_data; + + /* search for another identic update request */ + for (i = 0; i < g_queue_get_length(update_thread_data_queue); i++) { + update_thread_data = g_queue_peek_nth(update_thread_data_queue, i); + if (update_thread_data->streamdir == streamdir && + update_thread_data->category == category && + update_thread_data->streaminfo == streaminfo) { + exists = TRUE; + break; + } + } + + /* if no other similar request exists, we enqueue it */ + if (!exists) { + debug("another %d streamdir updates are pending, this request will be queued\n", update_thread_count); - if (update_thread_count >= MAX_UPDATE_THREADS) { - debug("another %d streamdir updates are pending, this request will be dropped\n", update_thread_count); - } - else - if (update_thread_count > 0) { - debug("another %d streamdir updates are pending, this request will be queued\n", update_thread_count); - - g_mutex_lock(update_thread_mutex); - - update_thread_data_t *update_thread_data = g_malloc(sizeof(update_thread_data_t)); - - update_thread_data->streamdir = streamdir; - update_thread_data->category = category; - update_thread_data->streaminfo = streaminfo; - g_queue_push_tail(update_thread_data_queue, update_thread_data); - - update_thread_count++; + update_thread_data = g_malloc(sizeof(update_thread_data_t)); - g_mutex_unlock(update_thread_mutex); - } - else { - update_thread_data_t *data = g_malloc(sizeof(update_thread_data_t)); - - data->streamdir = streamdir; - data->category = category; - data->streaminfo = streaminfo; + update_thread_data->streamdir = streamdir; + update_thread_data->category = category; + update_thread_data->streaminfo = streaminfo; + + g_queue_push_tail(update_thread_data_queue, update_thread_data); + update_thread_count++; + } + else { + debug("this request is already present in the queue, dropping\n"); + } + } + /* no thread is currently running, we start one */ + else { + debug("no other streamdir updates are pending, starting to process this request immediately\n"); + + update_thread_data_t *data = g_malloc(sizeof(update_thread_data_t)); - g_thread_create((GThreadFunc) update_thread_core, data, TRUE, NULL); - } + data->streamdir = streamdir; + data->category = category; + data->streaminfo = streaminfo; + + g_queue_push_tail(update_thread_data_queue, data); + update_thread_count++; + + g_thread_create((GThreadFunc) update_thread_core, NULL, FALSE, NULL); + } + + g_mutex_unlock(update_thread_mutex); + } } -static gpointer update_thread_core(update_thread_data_t *data) +static gpointer update_thread_core(gpointer user_data) { - g_mutex_lock(update_thread_mutex); - update_thread_count++; - g_mutex_unlock(update_thread_mutex); + debug("entering update thread core\n"); - /* update a streaminfo - that is - add this streaminfo to playlist */ - if (data->streaminfo != NULL) { - streaminfo_add_to_playlist(data->streaminfo); - } - /* update a category */ - else if (data->category != NULL) { - /* shoutcast */ - if (strncmp(data->streamdir->name, SHOUTCAST_NAME, strlen(SHOUTCAST_NAME)) == 0) { - shoutcast_category_fetch(data->category); - - gdk_threads_enter(); - streambrowser_win_set_category(data->streamdir, data->category); - gdk_threads_leave(); - } - } - /* update a streamdir */ - else if (data->streamdir != NULL) { - /* shoutcast */ - if (strncmp(data->streamdir->name, SHOUTCAST_NAME, strlen(SHOUTCAST_NAME)) == 0) { - streamdir_t *streamdir = shoutcast_streamdir_fetch(); - if (streamdir != NULL) { - gdk_threads_enter(); - streambrowser_win_set_streamdir(streamdir, SHOUTCAST_ICON); - gdk_threads_leave(); - } - } - } - /* update all streamdirs */ - else { - /* shoutcast */ - streamdir_t *shoutcast_streamdir = shoutcast_streamdir_fetch(); - if (shoutcast_streamdir != NULL) { - gdk_threads_enter(); - streambrowser_win_set_streamdir(shoutcast_streamdir, SHOUTCAST_ICON); - gdk_threads_leave(); - } - } - - g_free(data); - - /* check to see if there are pending update requests */ - - data = NULL; + /* try to get the last item in the queue */ g_mutex_lock(update_thread_mutex); - update_thread_count--; - + update_thread_data_t *data = NULL; if (update_thread_count > 0) { data = g_queue_pop_head(update_thread_data_queue); - - update_thread_count--; } g_mutex_unlock(update_thread_mutex); - if (data != NULL) - update_thread_core(data); + /* repetitively process the queue elements, until queue is empty */ + while (data != NULL && update_thread_count > 0) { + /* update a streaminfo - that is - add this streaminfo to playlist */ + if (data->streaminfo != NULL) { + gdk_threads_enter(); + streambrowser_win_set_streaminfo_state(data->streamdir, data->category, data->streaminfo, TRUE); + gdk_threads_leave(); + + streaminfo_add_to_playlist(data->streaminfo); + + gdk_threads_enter(); + streambrowser_win_set_streaminfo_state(data->streamdir, data->category, data->streaminfo, FALSE); + gdk_threads_leave(); + } + /* update a category */ + else if (data->category != NULL) { + /* shoutcast */ + if (strncmp(data->streamdir->name, SHOUTCAST_NAME, strlen(SHOUTCAST_NAME)) == 0) { + gdk_threads_enter(); + streambrowser_win_set_category_state(data->streamdir, data->category, TRUE); + gdk_threads_leave(); + + shoutcast_category_fetch(data->category); - return NULL; + gdk_threads_enter(); + streambrowser_win_set_category(data->streamdir, data->category); + streambrowser_win_set_category_state(data->streamdir, data->category, FALSE); + gdk_threads_leave(); + } + } + /* update a streamdir */ + else if (data->streamdir != NULL) { + /* shoutcast */ + if (strncmp(data->streamdir->name, SHOUTCAST_NAME, strlen(SHOUTCAST_NAME)) == 0) { + streamdir_t *streamdir = shoutcast_streamdir_fetch(); + if (streamdir != NULL) { + gdk_threads_enter(); + streambrowser_win_set_streamdir(streamdir, SHOUTCAST_ICON); + gdk_threads_leave(); + } + } + } + /* update all streamdirs */ + else { + /* shoutcast */ + streamdir_t *shoutcast_streamdir = shoutcast_streamdir_fetch(); + if (shoutcast_streamdir != NULL) { + gdk_threads_enter(); + streambrowser_win_set_streamdir(shoutcast_streamdir, SHOUTCAST_ICON); + gdk_threads_leave(); + } + } + + g_free(data); + + g_mutex_lock(update_thread_mutex); + update_thread_count--; + + /* try to get the last item in the queue */ + if (update_thread_count > 0) + data = g_queue_pop_head(update_thread_data_queue); + else + data = NULL; + g_mutex_unlock(update_thread_mutex); + } + + debug("leaving update thread core\n"); + + return NULL; } static void streaminfo_add_to_playlist(streaminfo_t *streaminfo) { - debug("fetching stream playlist for station '%s' from '%s'\n", streaminfo->name, streaminfo->playlist_url); - if (!fetch_remote_to_local_file(streaminfo->playlist_url, PLAYLIST_TEMP_FILE)) { - failure("shoutcast: stream playlist '%s' could not be downloaded to '%s'\n", streaminfo->playlist_url, PLAYLIST_TEMP_FILE); - return; - } - debug("stream playlist '%s' successfuly downloaded to '%s'\n", streaminfo->playlist_url, PLAYLIST_TEMP_FILE); - - aud_playlist_add(aud_playlist_get_active(), PLAYLIST_TEMP_FILE); + debug("fetching stream playlist for station '%s' from '%s'\n", streaminfo->name, streaminfo->playlist_url); + if (!fetch_remote_to_local_file(streaminfo->playlist_url, PLAYLIST_TEMP_FILE)) { + failure("shoutcast: stream playlist '%s' could not be downloaded to '%s'\n", streaminfo->playlist_url, PLAYLIST_TEMP_FILE); + return; + } + debug("stream playlist '%s' successfuly downloaded to '%s'\n", streaminfo->playlist_url, PLAYLIST_TEMP_FILE); + + aud_playlist_add_url(aud_playlist_get_active(), PLAYLIST_TEMP_FILE); } static void on_plugin_services_menu_item_click() { - debug("on_plugin_services_menu_item_click()\n"); - - streambrowser_win_show(); - streamdir_update(NULL, NULL, NULL); + debug("on_plugin_services_menu_item_click()\n"); + + streambrowser_win_show(); + streamdir_update(NULL, NULL, NULL); } diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/streambrowser.h --- a/src/streambrowser/streambrowser.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/streambrowser.h Sat Jul 12 03:39:55 2008 +0300 @@ -7,10 +7,12 @@ #include #include -#define DEF_STRING_LEN 1024 -#define DEF_BUFFER_SIZE 512 -#define MAX_UPDATE_THREADS 4 -#define PLAYLIST_TEMP_FILE "file:///tmp/playlist.pls" +#define DEF_STRING_LEN 1024 +#define DEF_BUFFER_SIZE 512 +#define MAX_UPDATE_THREADS 4 +#define PLAYLIST_TEMP_FILE "file:///tmp/playlist.pls" +#define STREAMBROWSER_ICON_SMALL DATA_DIR G_DIR_SEPARATOR_S "images" G_DIR_SEPARATOR_S "streambrowser-16x16.png" +#define STREAMBROWSER_ICON DATA_DIR G_DIR_SEPARATOR_S "images" G_DIR_SEPARATOR_S "streambrowser-64x64.png" typedef struct { diff -r 2d3594eaa18a -r 9e06acde819e src/streambrowser/streamdir.h --- a/src/streambrowser/streamdir.h Sat Jul 12 03:39:25 2008 +0300 +++ b/src/streambrowser/streamdir.h Sat Jul 12 03:39:55 2008 +0300 @@ -2,7 +2,6 @@ #ifndef STREAMDIR_H #define STREAMDIR_H - #include #include "streambrowser.h" @@ -31,7 +30,7 @@ } streamdir_t; -streamdir_t* streamdir_new(gchar *name); +streamdir_t* streamdir_new(gchar *name); void streamdir_delete(streamdir_t *streamdir); category_t* category_new(gchar *name); @@ -43,13 +42,13 @@ gint category_get_count(streamdir_t *streamdir); gint category_get_index(streamdir_t *streamdir, category_t *category); -streaminfo_t* streaminfo_new(gchar *name, gchar *playlist_url, gchar *current_track); +streaminfo_t* streaminfo_new(gchar *name, gchar *playlist_url, gchar *current_track); void streaminfo_delete(streaminfo_t *streaminfo); void streaminfo_free(streaminfo_t *streaminfo); void streaminfo_add(category_t *category, streaminfo_t *streaminfo); void streaminfo_remove(category_t *category, streaminfo_t *streaminfo); -streaminfo_t* streaminfo_get_by_index(category_t *category, gint index); -streaminfo_t* streaminfo_get_by_name(category_t *category, gchar *name); +streaminfo_t* streaminfo_get_by_index(category_t *category, gint index); +streaminfo_t* streaminfo_get_by_name(category_t *category, gchar *name); gint streaminfo_get_count(category_t *category); gint streaminfo_get_index(category_t *category, streaminfo_t *streaminfo);