Full Code of lastfm/lastfm-desktop for AI

master f5962d15dd30 cached
964 files
11.7 MB
3.1M tokens
6796 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (12,447K chars total). Download the full file to get everything.
Repository: lastfm/lastfm-desktop
Branch: master
Commit: f5962d15dd30
Files: 964
Total size: 11.7 MB

Directory structure:
gitextract_3180lsex/

├── .gitignore
├── .gitmodules
├── COPYING
├── Last.fm.pro
├── README.md
├── admin/
│   ├── Doxyfile
│   ├── dist/
│   │   ├── mac/
│   │   │   ├── AppleScriptSuite.sdef
│   │   │   ├── Growl Registration Ticket.growlRegDict
│   │   │   ├── Standard.plist
│   │   │   ├── build-release.rb
│   │   │   ├── bundleFrameworks.sh
│   │   │   ├── dacp.fm.last.Scrobbler.scpt
│   │   │   ├── dsa_pub.pem
│   │   │   ├── fm.last.Scrobbler.scpt
│   │   │   └── sign_update.rb
│   │   ├── updates/
│   │   │   ├── Changelog.txt
│   │   │   ├── Mac/
│   │   │   │   └── updates.xml
│   │   │   ├── Win/
│   │   │   │   └── updates.xml
│   │   │   ├── updates.html
│   │   │   ├── updates.linux.xml
│   │   │   ├── updates.mac.beta.xml
│   │   │   ├── updates.mac.xml
│   │   │   ├── updates.win.beta.xml
│   │   │   └── updates.win.xml
│   │   └── win/
│   │       ├── Last.fm.iss
│   │       ├── build-release-win.pl
│   │       ├── isspp
│   │       └── wix/
│   │           ├── boffin.wxs
│   │           ├── client.wxs
│   │           ├── eula.rtf
│   │           ├── qt.conf
│   │           ├── wixboff.cmd
│   │           └── wixclient.cmd
│   ├── include.qmake
│   ├── qmake/
│   │   ├── 1stparty.pro.inc
│   │   ├── 3rdparty.pro.inc
│   │   ├── QtOverride.pro.inc
│   │   └── debug.pro.inc
│   └── tests/
│       ├── QtTest_to_JUnit.xslt
│       ├── log_test.sh
│       └── run_tests.sh
├── app/
│   ├── boffin/
│   │   ├── App.cpp
│   │   ├── App.h
│   │   ├── HistoryWidget.cpp
│   │   ├── HistoryWidget.h
│   │   ├── Info.plist.in
│   │   ├── LocalCollectionScanner.cpp
│   │   ├── LocalCollectionScanner.h
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── MediaPipeline.cpp
│   │   ├── MediaPipeline.h
│   │   ├── PickDirsDialog.cpp
│   │   ├── PickDirsDialog.h
│   │   ├── PlaydarHostsModel.cpp
│   │   ├── PlaydarHostsModel.h
│   │   ├── PlaydarTagCloudModel.cpp
│   │   ├── PlaydarTagCloudModel.h
│   │   ├── Playlist.cpp
│   │   ├── Playlist.h
│   │   ├── PlaylistModel.cpp
│   │   ├── PlaylistModel.h
│   │   ├── PlaylistWidget.h
│   │   ├── ScanProgressWidget.cpp
│   │   ├── ScanProgressWidget.h
│   │   ├── ScrobSocket.cpp
│   │   ├── ScrobSocket.h
│   │   ├── Shuffler.cpp
│   │   ├── Shuffler.h
│   │   ├── TagBrowserWidget.cpp
│   │   ├── TagBrowserWidget.h
│   │   ├── TagCloudView.cpp
│   │   ├── TagCloudView.h
│   │   ├── TagDelegate.cpp
│   │   ├── TagDelegate.h
│   │   ├── TrackSource.cpp
│   │   ├── TrackSource.h
│   │   ├── WordleDialog.h
│   │   ├── XspfDialog.cpp
│   │   ├── XspfDialog.h
│   │   ├── XspfReader.cpp
│   │   ├── XspfReader.h
│   │   ├── boffin.pro
│   │   ├── comet/
│   │   │   ├── CometParser.cpp
│   │   │   ├── CometParser.h
│   │   │   └── YajlCallbacks.hpp
│   │   ├── json_spirit/
│   │   │   ├── README
│   │   │   ├── json_spirit.h
│   │   │   ├── json_spirit_reader.cpp
│   │   │   ├── json_spirit_reader.h
│   │   │   ├── json_spirit_utils.h
│   │   │   ├── json_spirit_value.cpp
│   │   │   ├── json_spirit_value.h
│   │   │   ├── json_spirit_writer.cpp
│   │   │   └── json_spirit_writer.h
│   │   ├── layouts/
│   │   │   ├── SideBySideLayout.cpp
│   │   │   └── SideBySideLayout.h
│   │   ├── main.cpp
│   │   ├── playdar/
│   │   │   ├── BoffinPlayableItem.cpp
│   │   │   ├── BoffinPlayableItem.h
│   │   │   ├── BoffinRqlRequest.cpp
│   │   │   ├── BoffinRqlRequest.h
│   │   │   ├── BoffinTagRequest.cpp
│   │   │   ├── BoffinTagRequest.h
│   │   │   ├── CometRequest.cpp
│   │   │   ├── CometRequest.h
│   │   │   ├── PlaydarApi.h
│   │   │   ├── PlaydarAuthRequest.cpp
│   │   │   ├── PlaydarAuthRequest.h
│   │   │   ├── PlaydarCometRequest.cpp
│   │   │   ├── PlaydarCometRequest.h
│   │   │   ├── PlaydarConnection.cpp
│   │   │   ├── PlaydarConnection.h
│   │   │   ├── PlaydarRosterRequest.cpp
│   │   │   ├── PlaydarRosterRequest.h
│   │   │   ├── PlaydarStatRequest.cpp
│   │   │   ├── PlaydarStatRequest.h
│   │   │   ├── TPlaydarApi.hpp
│   │   │   ├── TrackResolveRequest.cpp
│   │   │   ├── TrackResolveRequest.h
│   │   │   ├── jsonGetMember.cpp
│   │   │   └── jsonGetMember.h
│   │   ├── qrc/
│   │   │   └── boffin.qrc
│   │   └── sample/
│   │       └── SampleFromDistribution.h
│   ├── client/
│   │   ├── Application.cpp
│   │   ├── Application.h
│   │   ├── AudioscrobblerSettings.cpp
│   │   ├── AudioscrobblerSettings.h
│   │   ├── Bootstrapper/
│   │   │   ├── AbstractBootstrapper.cpp
│   │   │   ├── AbstractBootstrapper.h
│   │   │   ├── AbstractFileBootstrapper.cpp
│   │   │   ├── AbstractFileBootstrapper.h
│   │   │   ├── ITunesDevice/
│   │   │   │   ├── ITunesParser.h
│   │   │   │   ├── MediaDeviceInterface.h
│   │   │   │   ├── itunesdevice.cpp
│   │   │   │   └── itunesdevice.h
│   │   │   ├── PluginBootstrapper.cpp
│   │   │   ├── PluginBootstrapper.h
│   │   │   ├── iTunesBootstrapper.cpp
│   │   │   └── iTunesBootstrapper.h
│   │   ├── CommandReciever/
│   │   │   ├── CommandReciever.h
│   │   │   └── CommandReciever.mm
│   │   ├── Dialogs/
│   │   │   ├── BetaDialog.cpp
│   │   │   ├── BetaDialog.h
│   │   │   ├── BetaDialog.ui
│   │   │   ├── DiagnosticsDialog.cpp
│   │   │   ├── DiagnosticsDialog.h
│   │   │   ├── DiagnosticsDialog.ui
│   │   │   ├── LicensesDialog.cpp
│   │   │   ├── LicensesDialog.h
│   │   │   └── LicensesDialog.ui
│   │   ├── Fingerprinter/
│   │   │   ├── AacSource.cpp
│   │   │   ├── AacSource.h
│   │   │   ├── AacSource_p.h
│   │   │   ├── FlacSource.cpp
│   │   │   ├── FlacSource.h
│   │   │   ├── MadSource.cpp
│   │   │   ├── MadSource.h
│   │   │   ├── VorbisSource.cpp
│   │   │   └── VorbisSource.h
│   │   ├── Last.fm Scrobbler.css
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── MediaDevices/
│   │   │   ├── DeviceScrobbler.cpp
│   │   │   ├── DeviceScrobbler.h
│   │   │   ├── IpodDevice.cpp
│   │   │   ├── IpodDevice.h
│   │   │   ├── IpodDevice_linux.cpp
│   │   │   ├── IpodDevice_linux.h
│   │   │   ├── MediaDevice.cpp
│   │   │   └── MediaDevice.h
│   │   ├── Mpris2/
│   │   │   ├── DBusAbstractAdaptor.cpp
│   │   │   ├── DBusAbstractAdaptor.h
│   │   │   ├── MediaPlayer2.cpp
│   │   │   ├── MediaPlayer2.h
│   │   │   ├── MediaPlayer2Player.cpp
│   │   │   ├── MediaPlayer2Player.h
│   │   │   ├── Mpris2.cpp
│   │   │   └── Mpris2.h
│   │   ├── PrefPane/
│   │   │   ├── English.lproj/
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   └── MainWindow.xib
│   │   │   ├── FmLastPrefPane.h
│   │   │   ├── FmLastPrefPanePrefWidget.h
│   │   │   ├── FmLastPrefPanePrefWidget.mm
│   │   │   ├── FmLastPrefPaneQtView.h
│   │   │   ├── FmLastPrefPaneQtView.mm
│   │   │   ├── Info.plist
│   │   │   ├── PrefPane.pro
│   │   │   ├── PrefPane.xcodeproj/
│   │   │   │   └── project.pbxproj
│   │   │   └── PrefPane_prefix.pch
│   │   ├── ScrobSocket.cpp
│   │   ├── ScrobSocket.h
│   │   ├── Services/
│   │   │   ├── AnalyticsService/
│   │   │   │   ├── AnalyticsService.cpp
│   │   │   │   ├── AnalyticsService.h
│   │   │   │   ├── PersistentCookieJar.cpp
│   │   │   │   └── PersistentCookieJar.h
│   │   │   ├── AnalyticsService.h
│   │   │   ├── RadioService/
│   │   │   │   └── RadioService.cpp
│   │   │   ├── ScrobbleService/
│   │   │   │   ├── ScrobbleService.cpp
│   │   │   │   ├── ScrobbleService.h
│   │   │   │   ├── StopWatch.cpp
│   │   │   │   └── StopWatch.h
│   │   │   └── ScrobbleService.h
│   │   ├── Settings/
│   │   │   ├── AccountSettingsWidget.cpp
│   │   │   ├── AccountSettingsWidget.h
│   │   │   ├── AccountSettingsWidget.ui
│   │   │   ├── AdvancedSettingsWidget.cpp
│   │   │   ├── AdvancedSettingsWidget.h
│   │   │   ├── AdvancedSettingsWidget.ui
│   │   │   ├── CheckFileSystemModel.cpp
│   │   │   ├── CheckFileSystemModel.h
│   │   │   ├── CheckFileSystemView.cpp
│   │   │   ├── CheckFileSystemView.h
│   │   │   ├── GeneralSettingsWidget.cpp
│   │   │   ├── GeneralSettingsWidget.h
│   │   │   ├── GeneralSettingsWidget.ui
│   │   │   ├── IpodSettingsWidget.cpp
│   │   │   ├── IpodSettingsWidget.h
│   │   │   ├── IpodSettingsWidget.ui
│   │   │   ├── PreferencesDialog.cpp
│   │   │   ├── PreferencesDialog.h
│   │   │   ├── PreferencesDialog.ui
│   │   │   ├── ScrobbleSettingsWidget.cpp
│   │   │   ├── ScrobbleSettingsWidget.h
│   │   │   ├── ScrobbleSettingsWidget.ui
│   │   │   ├── SettingsWidget.cpp
│   │   │   └── SettingsWidget.h
│   │   ├── Widgets/
│   │   │   ├── BioWidget.cpp
│   │   │   ├── BioWidget.h
│   │   │   ├── ContextLabel.cpp
│   │   │   ├── ContextLabel.h
│   │   │   ├── FriendListWidget.cpp
│   │   │   ├── FriendListWidget.h
│   │   │   ├── FriendListWidget.ui
│   │   │   ├── FriendWidget.cpp
│   │   │   ├── FriendWidget.h
│   │   │   ├── FriendWidget.ui
│   │   │   ├── MetadataWidget.cpp
│   │   │   ├── MetadataWidget.h
│   │   │   ├── MetadataWidget.ui
│   │   │   ├── NothingPlayingWidget.cpp
│   │   │   ├── NothingPlayingWidget.h
│   │   │   ├── NothingPlayingWidget.ui
│   │   │   ├── NothingPlayingWidget_mac.mm
│   │   │   ├── NowPlayingStackedWidget.cpp
│   │   │   ├── NowPlayingStackedWidget.h
│   │   │   ├── NowPlayingWidget.cpp
│   │   │   ├── NowPlayingWidget.h
│   │   │   ├── PlaybackControlsWidget.cpp
│   │   │   ├── PlaybackControlsWidget.h
│   │   │   ├── PlaybackControlsWidget.ui
│   │   │   ├── PointyArrow.cpp
│   │   │   ├── PointyArrow.h
│   │   │   ├── ProfileArtistWidget.cpp
│   │   │   ├── ProfileArtistWidget.h
│   │   │   ├── ProfileWidget.cpp
│   │   │   ├── ProfileWidget.h
│   │   │   ├── ProfileWidget.ui
│   │   │   ├── PushButton.cpp
│   │   │   ├── PushButton.h
│   │   │   ├── RefreshButton.cpp
│   │   │   ├── RefreshButton.h
│   │   │   ├── ScrobbleControls.cpp
│   │   │   ├── ScrobbleControls.h
│   │   │   ├── ScrobblesListWidget.cpp
│   │   │   ├── ScrobblesListWidget.h
│   │   │   ├── ScrobblesWidget.cpp
│   │   │   ├── ScrobblesWidget.h
│   │   │   ├── ScrobblesWidget.ui
│   │   │   ├── ShortcutEdit.cpp
│   │   │   ├── ShortcutEdit.h
│   │   │   ├── SideBar.cpp
│   │   │   ├── SideBar.h
│   │   │   ├── SimilarArtistWidget.cpp
│   │   │   ├── SimilarArtistWidget.h
│   │   │   ├── StatusBar.cpp
│   │   │   ├── StatusBar.h
│   │   │   ├── TagWidget.cpp
│   │   │   ├── TagWidget.h
│   │   │   ├── TitleBar.cpp
│   │   │   ├── TitleBar.h
│   │   │   ├── TrackWidget.cpp
│   │   │   ├── TrackWidget.h
│   │   │   ├── TrackWidget.ui
│   │   │   ├── WidgetTextObject.cpp
│   │   │   └── WidgetTextObject.h
│   │   ├── Wizard/
│   │   │   ├── AccessPage.cpp
│   │   │   ├── AccessPage.h
│   │   │   ├── BootstrapInProgressPage.h
│   │   │   ├── BootstrapPage.cpp
│   │   │   ├── BootstrapPage.h
│   │   │   ├── BootstrapProgressPage.cpp
│   │   │   ├── BootstrapProgressPage.h
│   │   │   ├── FirstRunWizard.cpp
│   │   │   ├── FirstRunWizard.h
│   │   │   ├── FirstRunWizard.ui
│   │   │   ├── LoginPage.cpp
│   │   │   ├── LoginPage.h
│   │   │   ├── PluginsInstallPage.cpp
│   │   │   ├── PluginsInstallPage.h
│   │   │   ├── PluginsPage.cpp
│   │   │   ├── PluginsPage.h
│   │   │   ├── TourFinishPage.cpp
│   │   │   ├── TourFinishPage.h
│   │   │   ├── TourLocationPage.cpp
│   │   │   ├── TourLocationPage.h
│   │   │   ├── TourMetadataPage.cpp
│   │   │   ├── TourMetadataPage.h
│   │   │   ├── TourScrobblesPage.cpp
│   │   │   ├── TourScrobblesPage.h
│   │   │   ├── WizardPage.cpp
│   │   │   └── WizardPage.h
│   │   ├── audioscrobbler.icns
│   │   ├── audioscrobbler.rc
│   │   ├── client.pro
│   │   ├── lastfm-scrobbler.desktop
│   │   ├── main.cpp
│   │   └── qrc/
│   │       └── audioscrobbler.qrc
│   ├── fingerprinter/
│   │   ├── Fingerprinter.cpp
│   │   ├── Fingerprinter.h
│   │   ├── LAV_Source.cpp
│   │   ├── LAV_Source.h
│   │   ├── fingerprinter.pro
│   │   └── main.cpp
│   └── twiddly/
│       ├── IPod.cpp
│       ├── IPod.h
│       ├── IPodScrobble.h
│       ├── IPodSettings.h
│       ├── ITunesLibrary.h
│       ├── ITunesLibraryTrack.h
│       ├── ITunesLibrary_mac.cpp
│       ├── ITunesLibrary_win.cpp
│       ├── PlayCountsDatabase.cpp
│       ├── PlayCountsDatabase.h
│       ├── README
│       ├── Twiddly.rc
│       ├── TwiddlyApplication.cpp
│       ├── TwiddlyApplication.h
│       ├── Utils.cpp
│       ├── Utils.h
│       ├── Utils_mac.mm
│       ├── main.cpp
│       └── twiddly.pro
├── common/
│   ├── HideStupidWarnings.h
│   ├── c++/
│   │   ├── Logger.cpp
│   │   ├── Logger.h
│   │   ├── fileCreationTime.cpp
│   │   ├── mac/
│   │   │   └── getBsdProcessList.c
│   │   ├── string.h
│   │   └── win/
│   │       └── scrobSubPipeName.cpp
│   ├── precompiled.h
│   └── qt/
│       ├── README
│       ├── msleep.cpp
│       ├── override/
│       │   ├── QDebug
│       │   ├── QHttp
│       │   ├── QMessageBox
│       │   ├── QNetworkAccessManager
│       │   └── README
│       ├── reverse.cpp
│       └── sort.cpp
├── i18n/
│   ├── i18n.pro
│   ├── lastfm_de.ts
│   ├── lastfm_en.ts
│   ├── lastfm_es.ts
│   ├── lastfm_fr.ts
│   ├── lastfm_it.ts
│   ├── lastfm_ja.ts
│   ├── lastfm_pl.ts
│   ├── lastfm_pt.ts
│   ├── lastfm_ru.ts
│   ├── lastfm_sv.ts
│   ├── lastfm_tr.ts
│   └── lastfm_zh_CN.ts
├── lib/
│   ├── 3rdparty/
│   │   ├── README
│   │   ├── fetch.sh
│   │   ├── fftw3.h
│   │   ├── iTunesCOMAPI/
│   │   │   ├── LicenseAgreement.rtf
│   │   │   ├── ReadMe.rtf
│   │   │   ├── SampleScripts/
│   │   │   │   ├── CreateAlbumPlaylists.js
│   │   │   │   ├── RemoveDeadTracks.js
│   │   │   │   └── RemoveUserPlaylists.js
│   │   │   ├── iTunesCOM.chm
│   │   │   ├── iTunesCOMInterface.h
│   │   │   └── iTunesCOMInterface_i.c
│   │   ├── mad.h
│   │   ├── patches/
│   │   │   ├── README
│   │   │   └── tbytevector_cpp.patch
│   │   └── samplerate.h
│   ├── DllExportMacro.h
│   ├── listener/
│   │   ├── PlayerCommand.h
│   │   ├── PlayerCommandParser.cpp
│   │   ├── PlayerCommandParser.h
│   │   ├── PlayerConnection.cpp
│   │   ├── PlayerConnection.h
│   │   ├── PlayerListener.cpp
│   │   ├── PlayerListener.h
│   │   ├── PlayerMediator.cpp
│   │   ├── PlayerMediator.h
│   │   ├── State.h
│   │   ├── legacy/
│   │   │   ├── LegacyPlayerListener.cpp
│   │   │   └── LegacyPlayerListener.h
│   │   ├── listener.pro
│   │   ├── mac/
│   │   │   ├── ITunesListener.cpp
│   │   │   ├── ITunesListener.h
│   │   │   ├── SpotifyListener.h
│   │   │   └── SpotifyListener.mm
│   │   ├── mpris2/
│   │   │   ├── Mpris2Listener.cpp
│   │   │   ├── Mpris2Listener.h
│   │   │   ├── Mpris2Service.cpp
│   │   │   └── Mpris2Service.h
│   │   ├── tests/
│   │   │   ├── TestPlayerCommandParser.cpp
│   │   │   └── test_liblistener.pro
│   │   └── win/
│   │       ├── NamedPipeServer.cpp
│   │       ├── NamedPipeServer.h
│   │       ├── SpotifyListener.cpp
│   │       └── SpotifyListener.h
│   ├── logger/
│   │   └── logger.pro
│   └── unicorn/
│       ├── AnimatedPushButton.h
│       ├── AnimatedStatusBar.cpp
│       ├── AnimatedStatusBar.h
│       ├── CrashReporter/
│       │   ├── CrashReporter.cpp
│       │   ├── CrashReporter.h
│       │   └── CrashReporter_mac.mm
│       ├── DesktopServices.cpp
│       ├── DesktopServices.h
│       ├── LoginProcess.cpp
│       ├── LoginProcess.h
│       ├── PlayBus/
│       │   ├── Bus.cpp
│       │   ├── Bus.h
│       │   ├── PlayBus.cpp
│       │   └── PlayBus.h
│       ├── QMessageBoxBuilder.cpp
│       ├── QMessageBoxBuilder.h
│       ├── ScrobblesModel.cpp
│       ├── ScrobblesModel.h
│       ├── SignalBlocker.h
│       ├── TrackImageFetcher.cpp
│       ├── TrackImageFetcher.h
│       ├── UnicornApplication.cpp
│       ├── UnicornApplication.h
│       ├── UnicornApplicationDelegate.h
│       ├── UnicornApplicationDelegate.mm
│       ├── UnicornApplication_mac.mm
│       ├── UnicornCoreApplication.cpp
│       ├── UnicornCoreApplication.h
│       ├── UnicornMainWindow.cpp
│       ├── UnicornMainWindow.h
│       ├── UnicornSession.cpp
│       ├── UnicornSession.h
│       ├── UnicornSettings.cpp
│       ├── UnicornSettings.h
│       ├── UpdateInfoFetcher.cpp
│       ├── UpdateInfoFetcher.h
│       ├── Updater/
│       │   ├── Updater.cpp
│       │   ├── Updater.h
│       │   └── Updater_mac.mm
│       ├── dialogs/
│       │   ├── AboutDialog.cpp
│       │   ├── AboutDialog.h
│       │   ├── AboutDialog.ui
│       │   ├── CloseAppsDialog.cpp
│       │   ├── CloseAppsDialog.h
│       │   ├── CloseAppsDialog.ui
│       │   ├── CloseAppsDialog_mac.mm
│       │   ├── LoginContinueDialog.cpp
│       │   ├── LoginContinueDialog.h
│       │   ├── LoginDialog.cpp
│       │   ├── LoginDialog.h
│       │   ├── ProxyDialog.cpp
│       │   ├── ProxyDialog.h
│       │   ├── ProxyDialog.ui
│       │   ├── ScrobbleConfirmationDialog.cpp
│       │   ├── ScrobbleConfirmationDialog.h
│       │   ├── ScrobbleConfirmationDialog.ui
│       │   ├── ShareDialog.cpp
│       │   ├── ShareDialog.h
│       │   ├── ShareDialog.ui
│       │   ├── TagDialog.cpp
│       │   ├── TagDialog.h
│       │   ├── TagDialog.ui
│       │   ├── UnicornDialog.h
│       │   ├── UserManagerDialog.cpp
│       │   └── UserManagerDialog.h
│       ├── layouts/
│       │   ├── FlowLayout.cpp
│       │   └── FlowLayout.h
│       ├── mac/
│       │   ├── AppleScript.cpp
│       │   └── AppleScript.h
│       ├── notify/
│       │   ├── Notify.h
│       │   └── Notify.mm
│       ├── plugins/
│       │   ├── FooBar08PluginInfo.cpp
│       │   ├── FooBar08PluginInfo.h
│       │   ├── Foobar09PluginInfo.cpp
│       │   ├── Foobar09PluginInfo.h
│       │   ├── IPluginInfo.cpp
│       │   ├── IPluginInfo.h
│       │   ├── ITunesPluginInfo.cpp
│       │   ├── ITunesPluginInfo.h
│       │   ├── ITunesPluginInstaller.cpp
│       │   ├── ITunesPluginInstaller.h
│       │   ├── KillProcess.h
│       │   ├── PluginList.cpp
│       │   ├── PluginList.h
│       │   ├── Version.cpp
│       │   ├── Version.h
│       │   ├── WinampPluginInfo.cpp
│       │   ├── WinampPluginInfo.h
│       │   ├── WmpPluginInfo.cpp
│       │   └── WmpPluginInfo.h
│       ├── qrc/
│       │   ├── spinner.mng
│       │   └── unicorn.qrc
│       ├── qtsingleapplication/
│       │   ├── qtlocalpeer.cpp
│       │   ├── qtlocalpeer.h
│       │   ├── qtlockedfile.cpp
│       │   ├── qtlockedfile.h
│       │   ├── qtlockedfile_unix.cpp
│       │   ├── qtlockedfile_win.cpp
│       │   ├── qtsingleapplication.cpp
│       │   ├── qtsingleapplication.h
│       │   ├── qtsinglecoreapplication.cpp
│       │   └── qtsinglecoreapplication.h
│       ├── qtwin.cpp
│       ├── qtwin.h
│       ├── unicorn.pro
│       └── widgets/
│           ├── ActionButton.cpp
│           ├── ActionButton.h
│           ├── AvatarWidget.cpp
│           ├── AvatarWidget.h
│           ├── BannerWidget.cpp
│           ├── BannerWidget.h
│           ├── DataBox.h
│           ├── DataListWidget.cpp
│           ├── DataListWidget.h
│           ├── FriendsPicker.cpp
│           ├── FriendsPicker.h
│           ├── GhostWidget.cpp
│           ├── GhostWidget.h
│           ├── HttpImageWidget.cpp
│           ├── HttpImageWidget.h
│           ├── ImageButton.cpp
│           ├── ImageButton.h
│           ├── ItemSelectorWidget.cpp
│           ├── ItemSelectorWidget.h
│           ├── Label.cpp
│           ├── Label.h
│           ├── LfmListViewWidget.cpp
│           ├── LfmListViewWidget.h
│           ├── MessageBar.cpp
│           ├── MessageBar.h
│           ├── PlayableMimeData.h
│           ├── ProxyWidget.cpp
│           ├── ProxyWidget.h
│           ├── ProxyWidget.ui
│           ├── SearchBox.cpp
│           ├── SearchBox.h
│           ├── Seed.h
│           ├── SlidingStackedWidget.cpp
│           ├── SlidingStackedWidget.h
│           ├── SpinnerLabel.h
│           ├── StackedWidget.cpp
│           ├── StackedWidget.h
│           ├── StatusLight.cpp
│           ├── StatusLight.h
│           ├── TagListWidget.cpp
│           ├── TagListWidget.h
│           ├── TrackWidget.cpp
│           ├── TrackWidget.h
│           ├── UnicornTabWidget.cpp
│           ├── UnicornTabWidget.h
│           ├── UserComboSelector.h
│           ├── UserManagerWidget.cpp
│           ├── UserManagerWidget.h
│           ├── UserMenu.cpp
│           ├── UserMenu.h
│           ├── UserToolButton.cpp
│           └── UserToolButton.h
└── plugins/
    ├── LFMRadio/
    │   └── PluginInfo.h
    ├── foobar08/
    │   ├── audioscrobbler.cpp
    │   ├── foo_install.iss
    │   └── tools/
    │       └── append_once.bat
    ├── foobar09/
    │   ├── ChangeLog.txt
    │   ├── audioscrobbler.cpp
    │   ├── foo_audioscrobbler.rc
    │   ├── foo_install.iss
    │   ├── foobar_sdk/
    │   │   ├── foobar2000/
    │   │   │   ├── SDK/
    │   │   │   │   ├── abort_callback.cpp
    │   │   │   │   ├── abort_callback.h
    │   │   │   │   ├── advconfig.h
    │   │   │   │   ├── app_close_blocker.cpp
    │   │   │   │   ├── app_close_blocker.h
    │   │   │   │   ├── audio_chunk.cpp
    │   │   │   │   ├── audio_chunk.h
    │   │   │   │   ├── audio_chunk_channel_config.cpp
    │   │   │   │   ├── audio_postprocessor.h
    │   │   │   │   ├── cfg_var.cpp
    │   │   │   │   ├── cfg_var.h
    │   │   │   │   ├── chapterizer.cpp
    │   │   │   │   ├── chapterizer.h
    │   │   │   │   ├── commandline.cpp
    │   │   │   │   ├── commandline.h
    │   │   │   │   ├── completion_notify.cpp
    │   │   │   │   ├── completion_notify.h
    │   │   │   │   ├── component.h
    │   │   │   │   ├── component_client.h
    │   │   │   │   ├── components_menu.h
    │   │   │   │   ├── componentversion.h
    │   │   │   │   ├── config_io_callback.cpp
    │   │   │   │   ├── config_io_callback.h
    │   │   │   │   ├── config_object.cpp
    │   │   │   │   ├── config_object.h
    │   │   │   │   ├── config_object_impl.h
    │   │   │   │   ├── console.cpp
    │   │   │   │   ├── console.h
    │   │   │   │   ├── contextmenu.h
    │   │   │   │   ├── contextmenu_manager.h
    │   │   │   │   ├── core_api.h
    │   │   │   │   ├── coreversion.h
    │   │   │   │   ├── dsp.cpp
    │   │   │   │   ├── dsp.h
    │   │   │   │   ├── dsp_manager.cpp
    │   │   │   │   ├── dsp_manager.h
    │   │   │   │   ├── file_info.cpp
    │   │   │   │   ├── file_info.h
    │   │   │   │   ├── file_info_impl.cpp
    │   │   │   │   ├── file_info_impl.h
    │   │   │   │   ├── file_info_merge.cpp
    │   │   │   │   ├── file_operation_callback.cpp
    │   │   │   │   ├── file_operation_callback.h
    │   │   │   │   ├── filesystem.cpp
    │   │   │   │   ├── filesystem.h
    │   │   │   │   ├── filesystem_helper.cpp
    │   │   │   │   ├── filesystem_helper.h
    │   │   │   │   ├── foobar2000.h
    │   │   │   │   ├── genrand.h
    │   │   │   │   ├── guids.cpp
    │   │   │   │   ├── hasher_md5.cpp
    │   │   │   │   ├── hasher_md5.h
    │   │   │   │   ├── info_lookup_handler.h
    │   │   │   │   ├── initquit.h
    │   │   │   │   ├── input.cpp
    │   │   │   │   ├── input.h
    │   │   │   │   ├── input_file_type.cpp
    │   │   │   │   ├── input_file_type.h
    │   │   │   │   ├── input_impl.h
    │   │   │   │   ├── library_manager.h
    │   │   │   │   ├── link_resolver.cpp
    │   │   │   │   ├── link_resolver.h
    │   │   │   │   ├── main_thread_callback.h
    │   │   │   │   ├── mainmenu.cpp
    │   │   │   │   ├── masstagger_action.h
    │   │   │   │   ├── mem_block_container.cpp
    │   │   │   │   ├── mem_block_container.h
    │   │   │   │   ├── menu.h
    │   │   │   │   ├── menu_helpers.cpp
    │   │   │   │   ├── menu_helpers.h
    │   │   │   │   ├── menu_item.cpp
    │   │   │   │   ├── menu_manager.cpp
    │   │   │   │   ├── message_loop.h
    │   │   │   │   ├── metadb.cpp
    │   │   │   │   ├── metadb.h
    │   │   │   │   ├── metadb_handle.cpp
    │   │   │   │   ├── metadb_handle.h
    │   │   │   │   ├── metadb_handle_list.cpp
    │   │   │   │   ├── modeless_dialog.cpp
    │   │   │   │   ├── modeless_dialog.h
    │   │   │   │   ├── packet_decoder.cpp
    │   │   │   │   ├── packet_decoder.h
    │   │   │   │   ├── play_callback.h
    │   │   │   │   ├── playable_location.cpp
    │   │   │   │   ├── playable_location.h
    │   │   │   │   ├── playback_control.cpp
    │   │   │   │   ├── playback_control.h
    │   │   │   │   ├── playlist.cpp
    │   │   │   │   ├── playlist.h
    │   │   │   │   ├── playlist_loader.cpp
    │   │   │   │   ├── playlist_loader.h
    │   │   │   │   ├── playlist_lock.cpp
    │   │   │   │   ├── popup_message.cpp
    │   │   │   │   ├── popup_message.h
    │   │   │   │   ├── preferences_page.cpp
    │   │   │   │   ├── preferences_page.h
    │   │   │   │   ├── replaygain.cpp
    │   │   │   │   ├── replaygain.h
    │   │   │   │   ├── replaygain_info.cpp
    │   │   │   │   ├── resampler.h
    │   │   │   │   ├── service.cpp
    │   │   │   │   ├── service.h
    │   │   │   │   ├── service_impl.h
    │   │   │   │   ├── shared.h
    │   │   │   │   ├── shortcut_actions.h
    │   │   │   │   ├── stdafx.cpp
    │   │   │   │   ├── tag_processor.cpp
    │   │   │   │   ├── tag_processor.h
    │   │   │   │   ├── tag_processor_id3v2.cpp
    │   │   │   │   ├── threaded_process.cpp
    │   │   │   │   ├── threaded_process.h
    │   │   │   │   ├── titleformat.cpp
    │   │   │   │   ├── titleformat.h
    │   │   │   │   ├── titleformat_config.cpp
    │   │   │   │   ├── titleformat_config.h
    │   │   │   │   ├── track_property.h
    │   │   │   │   ├── ui.cpp
    │   │   │   │   ├── ui.h
    │   │   │   │   ├── unpack.h
    │   │   │   │   ├── utf8api.cpp
    │   │   │   │   └── vis.h
    │   │   │   ├── foo_input_raw/
    │   │   │   │   ├── foo_input_raw.cpp
    │   │   │   │   └── readme.txt
    │   │   │   ├── foo_input_validator/
    │   │   │   │   └── readme.txt
    │   │   │   ├── foobar2000_component_client/
    │   │   │   │   └── component_client.cpp
    │   │   │   ├── helpers/
    │   │   │   │   ├── StdAfx.cpp
    │   │   │   │   ├── StdAfx.h
    │   │   │   │   ├── bitreader_helper.h
    │   │   │   │   ├── cfg_guidlist.h
    │   │   │   │   ├── cfg_structlist.h
    │   │   │   │   ├── create_directory_helper.cpp
    │   │   │   │   ├── create_directory_helper.h
    │   │   │   │   ├── cue_creator.cpp
    │   │   │   │   ├── cue_creator.h
    │   │   │   │   ├── cue_parser.cpp
    │   │   │   │   ├── cue_parser.h
    │   │   │   │   ├── cue_parser_embedding.cpp
    │   │   │   │   ├── cuesheet_index_list.cpp
    │   │   │   │   ├── cuesheet_index_list.h
    │   │   │   │   ├── dialog_resize_helper.cpp
    │   │   │   │   ├── dialog_resize_helper.h
    │   │   │   │   ├── dropdown_helper.cpp
    │   │   │   │   ├── dropdown_helper.h
    │   │   │   │   ├── dynamic_bitrate_helper.cpp
    │   │   │   │   ├── dynamic_bitrate_helper.h
    │   │   │   │   ├── file_cached.h
    │   │   │   │   ├── file_info_const_impl.cpp
    │   │   │   │   ├── file_info_const_impl.h
    │   │   │   │   ├── file_list_helper.cpp
    │   │   │   │   ├── file_list_helper.h
    │   │   │   │   ├── file_move_helper.cpp
    │   │   │   │   ├── file_move_helper.h
    │   │   │   │   ├── file_win32_wrapper.h
    │   │   │   │   ├── file_wrapper_simple.cpp
    │   │   │   │   ├── file_wrapper_simple.h
    │   │   │   │   ├── format_title_group.cpp
    │   │   │   │   ├── format_title_group.h
    │   │   │   │   ├── helpers.h
    │   │   │   │   ├── inplace_edit.cpp
    │   │   │   │   ├── inplace_edit.h
    │   │   │   │   ├── input_helpers.cpp
    │   │   │   │   ├── input_helpers.h
    │   │   │   │   ├── listview_helper.cpp
    │   │   │   │   ├── listview_helper.h
    │   │   │   │   ├── meta_table_builder.h
    │   │   │   │   ├── metadb_io_hintlist.cpp
    │   │   │   │   ├── metadb_io_hintlist.h
    │   │   │   │   ├── mp3_utils.cpp
    │   │   │   │   ├── mp3_utils.h
    │   │   │   │   ├── preload_info_helper.cpp
    │   │   │   │   ├── preload_info_helper.h
    │   │   │   │   ├── search_filter.cpp
    │   │   │   │   ├── search_filter.h
    │   │   │   │   ├── seekabilizer.cpp
    │   │   │   │   ├── seekabilizer.h
    │   │   │   │   ├── stream_buffer_helper.cpp
    │   │   │   │   ├── stream_buffer_helper.h
    │   │   │   │   ├── string_filter.h
    │   │   │   │   ├── text_file_loader.cpp
    │   │   │   │   ├── text_file_loader.h
    │   │   │   │   ├── wildcard.cpp
    │   │   │   │   ├── wildcard.h
    │   │   │   │   ├── win32_dialog.cpp
    │   │   │   │   ├── win32_dialog.h
    │   │   │   │   ├── win32_misc.cpp
    │   │   │   │   ├── win32_misc.h
    │   │   │   │   ├── window_placement_helper.cpp
    │   │   │   │   └── window_placement_helper.h
    │   │   │   └── shared/
    │   │   │       ├── audio_math.h
    │   │   │       ├── shared.h
    │   │   │       ├── shared.lib
    │   │   │       └── win32_misc.h
    │   │   ├── pfc/
    │   │   │   ├── alloc.h
    │   │   │   ├── array.h
    │   │   │   ├── avltree.h
    │   │   │   ├── bit_array.h
    │   │   │   ├── bit_array_impl.h
    │   │   │   ├── bsearch.cpp
    │   │   │   ├── bsearch.h
    │   │   │   ├── bsearch_inline.h
    │   │   │   ├── byte_order_helper.h
    │   │   │   ├── chainlist.h
    │   │   │   ├── com_ptr_t.h
    │   │   │   ├── guid.cpp
    │   │   │   ├── guid.h
    │   │   │   ├── instance_tracker.h
    │   │   │   ├── int_types.h
    │   │   │   ├── license.txt
    │   │   │   ├── list.h
    │   │   │   ├── map.h
    │   │   │   ├── mem_block_mgr.h
    │   │   │   ├── order_helper.h
    │   │   │   ├── other.cpp
    │   │   │   ├── other.h
    │   │   │   ├── pfc.h
    │   │   │   ├── primitives.h
    │   │   │   ├── printf.cpp
    │   │   │   ├── profiler.cpp
    │   │   │   ├── profiler.h
    │   │   │   ├── ptr_list.h
    │   │   │   ├── rcptr.h
    │   │   │   ├── ref_counter.h
    │   │   │   ├── selftest.cpp
    │   │   │   ├── sort.cpp
    │   │   │   ├── sort.h
    │   │   │   ├── stdafx.cpp
    │   │   │   ├── string.cpp
    │   │   │   ├── string.h
    │   │   │   ├── string8_impl.h
    │   │   │   ├── string_conv.cpp
    │   │   │   ├── string_conv.h
    │   │   │   ├── string_list.h
    │   │   │   ├── traits.h
    │   │   │   └── utf8.cpp
    │   │   ├── sdk-license.txt
    │   │   ├── sdk-readme.css
    │   │   └── sdk-readme.html
    │   ├── resource.h
    │   └── tools/
    │       └── append_once.bat
    ├── iTunes/
    │   ├── ChangeLog.txt
    │   ├── IPod.cpp
    │   ├── IPod.h
    │   ├── IPodDetector.h
    │   ├── IPodDetector_mac.cpp
    │   ├── IPodDetector_win.cpp
    │   ├── IPod_mac.cpp
    │   ├── IPod_win.cpp
    │   ├── ITunesComThread.cpp
    │   ├── ITunesComThread.h
    │   ├── ITunesComWrapper.cpp
    │   ├── ITunesComWrapper.h
    │   ├── ITunesEventInterface.h
    │   ├── ITunesExceptions.h
    │   ├── ITunesPlaysDatabase.cpp
    │   ├── ITunesPlaysDatabase.h
    │   ├── ITunesPlaysDatabase_mac.cpp
    │   ├── ITunesPlaysDatabase_win.cpp
    │   ├── ITunesTrack.cpp
    │   ├── ITunesTrack.h
    │   ├── Moose.h
    │   ├── Moose_mac.cpp
    │   ├── Moose_win.cpp
    │   ├── Plist.cpp
    │   ├── Plist.h
    │   ├── README.dist
    │   ├── _iTunes.iss
    │   ├── _iTunes.plist
    │   ├── _iTunes.rc
    │   ├── _iTunes.xcodeproj/
    │   │   └── project.pbxproj
    │   ├── iTunesVisualAPI/
    │   │   ├── iTunesAPI.cpp
    │   │   ├── iTunesAPI.h
    │   │   └── iTunesVisualAPI.h
    │   ├── libs/
    │   │   ├── sqlite3.c
    │   │   └── sqlite3.h
    │   ├── main.cpp
    │   ├── main.h
    │   ├── main_mac.cpp
    │   ├── main_win.cpp
    │   ├── resource.h
    │   ├── scripts/
    │   │   ├── currentTrack.scpt
    │   │   ├── currentTrackLocation.scpt
    │   │   ├── currentTrackPersistentId.scpt
    │   │   ├── playCountForDatabaseId.scpt
    │   │   ├── playCountForPersistentId.scpt
    │   │   └── uninstall.sh
    │   ├── tests/
    │   │   ├── ITunesPlaysDatabaseMac.pro
    │   │   ├── TestITunesPlaysDatabaseMac.cpp
    │   │   ├── comtest.cpp
    │   │   └── tests.pro
    │   └── tools/
    │       └── append_once.bat
    ├── scrobsub/
    │   ├── BlockingClient.cpp
    │   ├── BlockingClient.h
    │   ├── Bootstrap.cpp
    │   ├── Bootstrap.h
    │   ├── Bootstrap.rc
    │   ├── Doxyfile
    │   ├── EncodingUtils.cpp
    │   ├── EncodingUtils.h
    │   ├── RegistryUtils.cpp
    │   ├── RegistryUtils.h
    │   ├── ScrobSub.xcodeproj/
    │   │   └── project.pbxproj
    │   ├── ScrobSubmitter.cpp
    │   ├── ScrobSubmitter.h
    │   ├── StdString.h
    │   ├── resource.h
    │   ├── resource1.h
    │   └── tests/
    │       ├── BlockingClient.cpp
    │       └── EncodingUtils.cpp
    ├── winamp/
    │   ├── AutoChar.h
    │   ├── Dbg.h
    │   ├── GEN.H
    │   ├── Gen_AudioScrobbler.cpp
    │   ├── Gen_AudioScrobbler.dsp
    │   ├── Gen_AudioScrobbler.dsw
    │   ├── Gen_AudioScrobbler.h
    │   ├── Gen_AudioScrobbler.rc
    │   ├── OSVer.cpp
    │   ├── OSVer.h
    │   ├── Registry.cpp
    │   ├── Registry.h
    │   ├── Scrobbler.cpp
    │   ├── Scrobbler.h
    │   ├── StdAfx.cpp
    │   ├── StdAfx.h
    │   ├── StdString.h
    │   ├── StdStringArray.cpp
    │   ├── StdStringArray.h
    │   ├── UTF.cpp
    │   ├── UTF.h
    │   ├── VersionApp.cpp
    │   ├── VersionApp.h
    │   ├── WhatsNew.txt
    │   ├── WinampBootstrap.cpp
    │   ├── WinampBootstrap.h
    │   ├── WinampController.cpp
    │   ├── WinampController.h
    │   ├── WinampScrobbler.cpp
    │   ├── WinampScrobbler.h
    │   ├── comdate.h
    │   ├── dbg.cpp
    │   ├── ml.h
    │   ├── ml_lib.cpp
    │   ├── res/
    │   │   └── Gen_AudioScrobbler.rc2
    │   ├── resource.h
    │   ├── wa_dlg.h
    │   ├── wa_hotkeys.h
    │   ├── wa_ipc.h
    │   ├── winamp_install.iss
    │   └── winampcmd.h
    └── wmp/
        ├── Dbg.h
        ├── OSVer.cpp
        ├── OSVer.h
        ├── Scrobbler.cpp
        ├── Scrobbler.h
        ├── StdAfx.cpp
        ├── StdAfx.h
        ├── StdString.h
        ├── StdStringArray.cpp
        ├── StdStringArray.h
        ├── VersionApp.cpp
        ├── VersionApp.h
        ├── WMPScrobbler.cpp
        ├── WMPScrobbler.h
        ├── WhatsNew.txt
        ├── comdate.h
        ├── dbg.cpp
        ├── resource.h
        ├── tools/
        │   └── append_once.bat
        ├── wmp.h
        ├── wmpBootStrap.cpp
        ├── wmpBootStrap.h
        ├── wmp_install.iss
        ├── wmp_scrobbler.cpp
        ├── wmp_scrobbler.def
        ├── wmp_scrobbler.dsp
        ├── wmp_scrobbler.h
        ├── wmp_scrobbler.rc
        ├── wmp_scrobbler.rgs
        ├── wmp_scrobbler.vcxproj
        ├── wmp_scrobblerEvents.cpp
        ├── wmp_scrobblerdll.cpp
        └── wmpplug.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
_build/
_files.qmake
_build_parameters.pl.h
Makefile*
/_bin/
/_include/
admin/dist/mac/dsa_priv.pem
*.idb
*.pdb
*.ncb
*.vcproj*
*.sln
*.suo
.DS_Store
*.breakpad
*.user
*.qm
*.exe
*.vscode
Growl
Sparkle


================================================
FILE: .gitmodules
================================================


================================================
FILE: COPYING
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS


================================================
FILE: Last.fm.pro
================================================
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = lib/logger \
          lib/unicorn \
          lib/listener \
          i18n \
          app/client \
          app/twiddly \ 
          app/fingerprinter
          #app/boffin

unix:!mac:SUBDIRS -= app/twiddly

CONFIG( tests ) {
    SUBDIRS += \
        lib/lastfm/core/tests/test_libcore.pro \
        lib/lastfm/types/tests/test_libtypes.pro \
        lib/lastfm/scrobble/tests/test_libscrobble.pro \
        lib/listener/tests/test_liblistener.pro
}


================================================
FILE: README.md
================================================
Join us for chats on IRC!

Server: irc.last.fm
Channel: #last.desktop

# Build Dependencies

* Qt >= 4.8 (http://download.qt.io/archive/qt/4.8/4.8.7/qt-opensource-windows-x86-vs2010-4.8.7.exe)
* liblastfm >= 1.0.7

You will also need depending on your chosen platform:-

## Mac OS X

### Homebrew

We recommend that you use Homebrew to install most of the dependencies.

We recommend you have XCode set as your build toolchain.

```
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

```

```
brew install ffmpeg coreutils cmake fftw libsamplerate
```


We recommend Qt 4.8.7, the last version with Webkit support.

```
brew install cartr/qt4/qt@4
brew install cartr/qt4/qt-webkit@2.3
```

### liblastfm

Download liblastfm from https://github.com/lastfm/liblastfm parallel to the build of lastfm-desktop.

As the Desktop Client supports only Qt4 at the moment, you will need to set it to Qt4 mode.

In CMakeLists.txt, change
```
option(BUILD_WITH_QT4 "Build liblastfm with Qt4" ON)

```

Then build and make.
```
cd liblastfm
mkdir _build && cd _build
cmake ..
make -j4
make install
```

### Other dependencies

You'll also need the Growl and libsparkle frameworks.

Get the latest Growl SDk from here http://code.google.com/p/growl/downloads/list - latest tested 1.2.2

Get the latest Sparkle from here http://sparkle.andymatuschak.org/ - latest tested 1.21.3

Unzip both and put their frameworks in /Library/Frameworks/ so the build will find them.

You may need to symlink the headers files into the lastfm-desktop directory:

```
ln -s /Library/Frameworks/Sparkle.framework/Headers Sparkle
ln -s /Library/Frameworks/Growl.framework/Headers Growl
```

### Now you're ready!

```
cd lastfm-desktop
rm -r _bin
qmake -r
make clean
make -j4
```


## Windows

We used to build using Cygwin, but now we prefer not to.

You should get Windows version of the tool chain. Here are some recommendations.

- Git: http://code.google.com/p/msysgit/downloads/list
- CMake: http://www.cmake.org/cmake/resources/software.html
- pkg-config: http://www.gtk.org/download/win32.php
- Ruby: http://rubyinstaller.org/
- Perl: http://www.perl.org/get.html
- Win Platform SDK:http://www.microsoft.com/en-us/download/details.aspx?id=8279
- KDE Support: http://windows.kde.org/ Install the automoc and dbus packages.

### Qt

Install Qt binaries from either the Qt SDK or standalone binary package. You should be able to find everything here http://qt.nokia.com/downloads

You will also need the latest Windows SDK. We build using Visual Studio 2008.

### Winsparkle

This is the library we use to check for app updates. You should download the latest dll and headers form here http://winsparkle.org

This step should be optional really as most people will not want to add the update checking.

I found that I also needed to copy the dll into the lastfm-desktop/_bin folder. Create a pkg-config file for WinSparkle like this:

    Name: sparkle
    Description: Multimedia Library
    Version: 0.3
    Libs: -LC:/dev/Install/WinSparkle/Release -lWinSparkle
    Cflags: -IC:/dev/Install/WinSparkle/include

## Linux

On Debian or Ubuntu, you can download all the build dependencies by running:

    sudo apt-get install libavformat-dev libgpod-nogtk-dev liblastfm-dev \
                         libqt4-dev libqtwebkit-dev pkg-config \
                         zlib1g-dev

You should also install the `libqt4-sql-sqlite` plugin if you want to use the
software to scrobble your iPod.

# Build Instructions

    qmake -r
    make -j4
    
`make install` currently does not work on Windows or OSX.

Windows note: use nmake on Windows

Linux note: Linux users can set the install prefix like so `qmake PREFIX=/usr/local`

OSX note: if you installed Qt through homebrew it will default to a release build.

# Run Instructions

Apps are styled using stylesheets which are found in the source directory
of the app. By default the executable path is checked for the css file on
Windows and on OSX the bundle Resource directory is checked otherwise you'll
need to tell the app where the stylesheet is, like this: 

    ./Last.fm.exe -stylesheet path/to/Last.fm.css
    
On Linux, if you have not run `make install`, you can run the app like this
from the root of the source directory:

    _bin/lastfm-scrobbler -stylesheet app/client/Last.fm\ Scrobbler.css

# Build Support

We support developers trying to build the source on any platform. 

Seeing as we don't provide many varieties of binary package on Linux, we also
support non-developers building from source there. However within reason!
Please check around the net a little first. Ask your friends. Demand help
from people standing at bus-stops.

Maybe check the official forum: http://getsatisfaction.com/lastfm

# Bugs

If you find a bug in the software, please let us know about it.

Michael Coffey<michaelc@last.fm>
Desktop App Lead Developer, Last.fm


================================================
FILE: admin/Doxyfile
================================================
# Doxyfile 1.6.1

# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project
#
# All text after a hash (#) is considered a comment and will be ignored
# The format is:
#       TAG = value [value, ...]
# For lists items can also be appended using:
#       TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (" ")

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------

# This tag specifies the encoding used for all characters in the config file 
# that follow. The default is UTF-8 which is also the encoding used for all 
# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
# iconv built into libc) for the transcoding. See 
# http://www.gnu.org/software/libiconv for the list of possible encodings.

DOXYFILE_ENCODING      = UTF-8

# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
# by quotes) that should identify the project.

PROJECT_NAME           = lastfm-desktop

# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
# This could be handy for archiving the generated documentation or 
# if some version control system is used.

PROJECT_NUMBER         = 

# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
# base path where the generated documentation will be put. 
# If a relative path is entered, it will be relative to the location 
# where doxygen was started. If left blank the current directory will be used.

OUTPUT_DIRECTORY       = /Users/jono/dev/lastfm-desktop/_docs

# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
# 4096 sub-directories (in 2 levels) under the output directory of each output 
# format and will distribute the generated files over these directories. 
# Enabling this option can be useful when feeding doxygen a huge amount of 
# source files, where putting all generated files in the same directory would 
# otherwise cause performance problems for the file system.

CREATE_SUBDIRS         = NO

# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
# documentation generated by doxygen is written. Doxygen will use this 
# information to generate all constant output in the proper language. 
# The default language is English, other supported languages are: 
# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.

OUTPUT_LANGUAGE        = English

# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
# include brief member descriptions after the members that are listed in 
# the file and class documentation (similar to JavaDoc). 
# Set to NO to disable this.

BRIEF_MEMBER_DESC      = YES

# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
# the brief description of a member or function before the detailed description. 
# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
# brief descriptions will be completely suppressed.

REPEAT_BRIEF           = YES

# This tag implements a quasi-intelligent brief description abbreviator 
# that is used to form the text in various listings. Each string 
# in this list, if found as the leading text of the brief description, will be 
# stripped from the text and the result after processing the whole list, is 
# used as the annotated text. Otherwise, the brief description is used as-is. 
# If left blank, the following values are used ("$name" is automatically 
# replaced with the name of the entity): "The $name class" "The $name widget" 
# "The $name file" "is" "provides" "specifies" "contains" 
# "represents" "a" "an" "the"

ABBREVIATE_BRIEF       = "The $name class" \
                         "The $name widget" \
                         "The $name file" \
                         is \
                         provides \
                         specifies \
                         contains \
                         represents \
                         a \
                         an \
                         the

# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
# Doxygen will generate a detailed section even if there is only a brief 
# description.

ALWAYS_DETAILED_SEC    = NO

# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
# inherited members of a class in the documentation of that class as if those 
# members were ordinary class members. Constructors, destructors and assignment 
# operators of the base classes will not be shown.

INLINE_INHERITED_MEMB  = NO

# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
# path before files name in the file list and in the header files. If set 
# to NO the shortest path that makes the file name unique will be used.

FULL_PATH_NAMES        = YES

# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
# can be used to strip a user-defined part of the path. Stripping is 
# only done if one of the specified strings matches the left-hand part of 
# the path. The tag can be used to show relative paths in the file list. 
# If left blank the directory from which doxygen is run is used as the 
# path to strip.

STRIP_FROM_PATH        = /Users/dimitri/doxygen/mail/1.5.7/doxywizard/

# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
# the path mentioned in the documentation of a class, which tells 
# the reader which header file to include in order to use a class. 
# If left blank only the name of the header file containing the class 
# definition is used. Otherwise one should specify the include paths that 
# are normally passed to the compiler using the -I flag.

STRIP_FROM_INC_PATH    = 

# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
# (but less readable) file names. This can be useful is your file systems 
# doesn't support long names like on DOS, Mac, or CD-ROM.

SHORT_NAMES            = NO

# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
# will interpret the first line (until the first dot) of a JavaDoc-style 
# comment as the brief description. If set to NO, the JavaDoc 
# comments will behave just like regular Qt-style comments 
# (thus requiring an explicit @brief command for a brief description.)

JAVADOC_AUTOBRIEF      = NO

# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
# interpret the first line (until the first dot) of a Qt-style 
# comment as the brief description. If set to NO, the comments 
# will behave just like regular Qt-style comments (thus requiring 
# an explicit \brief command for a brief description.)

QT_AUTOBRIEF           = NO

# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
# comments) as a brief description. This used to be the default behaviour. 
# The new default is to treat a multi-line C++ comment block as a detailed 
# description. Set this tag to YES if you prefer the old behaviour instead.

MULTILINE_CPP_IS_BRIEF = NO

# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
# member inherits the documentation from any documented member that it 
# re-implements.

INHERIT_DOCS           = YES

# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
# a new page for each member. If set to NO, the documentation of a member will 
# be part of the file/class/namespace that contains it.

SEPARATE_MEMBER_PAGES  = NO

# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
# Doxygen uses this value to replace tabs by spaces in code fragments.

TAB_SIZE               = 8

# This tag can be used to specify a number of aliases that acts 
# as commands in the documentation. An alias has the form "name=value". 
# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
# put the command \sideeffect (or @sideeffect) in the documentation, which 
# will result in a user-defined paragraph with heading "Side Effects:". 
# You can put \n's in the value part of an alias to insert newlines.

ALIASES                = 

# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
# sources only. Doxygen will then generate output that is more tailored for C. 
# For instance, some of the names that are used will be different. The list 
# of all members will be omitted, etc.

OPTIMIZE_OUTPUT_FOR_C  = NO

# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
# sources only. Doxygen will then generate output that is more tailored for 
# Java. For instance, namespaces will be presented as packages, qualified 
# scopes will look different, etc.

OPTIMIZE_OUTPUT_JAVA   = NO

# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
# sources only. Doxygen will then generate output that is more tailored for 
# Fortran.

OPTIMIZE_FOR_FORTRAN   = NO

# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
# sources. Doxygen will then generate output that is tailored for 
# VHDL.

OPTIMIZE_OUTPUT_VHDL   = NO

# Doxygen selects the parser to use depending on the extension of the files it parses. 
# With this tag you can assign which parser to use for a given extension. 
# Doxygen has a built-in mapping, but you can override or extend it using this tag. 
# The format is ext=language, where ext is a file extension, and language is one of 
# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, 
# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat 
# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), 
# use: inc=Fortran f=C. Note that for custom extensions you also need to set
# FILE_PATTERNS otherwise the files are not read by doxygen.

EXTENSION_MAPPING      = 

# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
# to include (a tag file for) the STL sources as input, then you should 
# set this tag to YES in order to let doxygen match functions declarations and 
# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
# func(std::string) {}). This also make the inheritance and collaboration 
# diagrams that involve STL classes more complete and accurate.

BUILTIN_STL_SUPPORT    = NO

# If you use Microsoft's C++/CLI language, you should set this option to YES to 
# enable parsing support.

CPP_CLI_SUPPORT        = NO

# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
# Doxygen will parse them like normal C++ but will assume all classes use public 
# instead of private inheritance when no explicit protection keyword is present.

SIP_SUPPORT            = NO

# For Microsoft's IDL there are propget and propput attributes to indicate getter 
# and setter methods for a property. Setting this option to YES (the default) 
# will make doxygen to replace the get and set methods by a property in the 
# documentation. This will only work if the methods are indeed getting or 
# setting a simple type. If this is not the case, or you want to show the 
# methods anyway, you should set this option to NO.

IDL_PROPERTY_SUPPORT   = YES

# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
# tag is set to YES, then doxygen will reuse the documentation of the first 
# member in the group (if any) for the other members of the group. By default 
# all members of a group must be documented explicitly.

DISTRIBUTE_GROUP_DOC   = NO

# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
# the same type (for instance a group of public functions) to be put as a 
# subgroup of that type (e.g. under the Public Functions section). Set it to 
# NO to prevent subgrouping. Alternatively, this can be done per class using 
# the \nosubgrouping command.

SUBGROUPING            = YES

# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
# is documented as struct, union, or enum with the name of the typedef. So 
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
# with name TypeT. When disabled the typedef will appear as a member of a file, 
# namespace, or class. And the struct will be named TypeS. This can typically 
# be useful for C code in case the coding convention dictates that all compound 
# types are typedef'ed and only the typedef is referenced, never the tag name.

TYPEDEF_HIDES_STRUCT   = NO

# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
# determine which symbols to keep in memory and which to flush to disk. 
# When the cache is full, less often used symbols will be written to disk. 
# For small to medium size projects (<1000 input files) the default value is 
# probably good enough. For larger projects a too small cache size can cause 
# doxygen to be busy swapping symbols to and from disk most of the time 
# causing a significant performance penality. 
# If the system has enough physical memory increasing the cache will improve the 
# performance by keeping more symbols in memory. Note that the value works on 
# a logarithmic scale so increasing the size by one will rougly double the 
# memory usage. The cache size is given by this formula: 
# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
# corresponding to a cache size of 2^16 = 65536 symbols

SYMBOL_CACHE_SIZE      = 0

#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------

# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
# documentation are documented, even if no documentation was available. 
# Private class members and static file members will be hidden unless 
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES

EXTRACT_ALL            = YES

# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
# will be included in the documentation.

EXTRACT_PRIVATE        = NO

# If the EXTRACT_STATIC tag is set to YES all static members of a file 
# will be included in the documentation.

EXTRACT_STATIC         = NO

# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
# defined locally in source files will be included in the documentation. 
# If set to NO only classes defined in header files are included.

EXTRACT_LOCAL_CLASSES  = YES

# This flag is only useful for Objective-C code. When set to YES local 
# methods, which are defined in the implementation section but not in 
# the interface are included in the documentation. 
# If set to NO (the default) only methods in the interface are included.

EXTRACT_LOCAL_METHODS  = NO

# If this flag is set to YES, the members of anonymous namespaces will be 
# extracted and appear in the documentation as a namespace called 
# 'anonymous_namespace{file}', where file will be replaced with the base 
# name of the file that contains the anonymous namespace. By default 
# anonymous namespace are hidden.

EXTRACT_ANON_NSPACES   = NO

# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
# undocumented members of documented classes, files or namespaces. 
# If set to NO (the default) these members will be included in the 
# various overviews, but no documentation section is generated. 
# This option has no effect if EXTRACT_ALL is enabled.

HIDE_UNDOC_MEMBERS     = NO

# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
# undocumented classes that are normally visible in the class hierarchy. 
# If set to NO (the default) these classes will be included in the various 
# overviews. This option has no effect if EXTRACT_ALL is enabled.

HIDE_UNDOC_CLASSES     = NO

# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
# friend (class|struct|union) declarations. 
# If set to NO (the default) these declarations will be included in the 
# documentation.

HIDE_FRIEND_COMPOUNDS  = NO

# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
# documentation blocks found inside the body of a function. 
# If set to NO (the default) these blocks will be appended to the 
# function's detailed documentation block.

HIDE_IN_BODY_DOCS      = NO

# The INTERNAL_DOCS tag determines if documentation 
# that is typed after a \internal command is included. If the tag is set 
# to NO (the default) then the documentation will be excluded. 
# Set it to YES to include the internal documentation.

INTERNAL_DOCS          = NO

# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
# file names in lower-case letters. If set to YES upper-case letters are also 
# allowed. This is useful if you have classes or files whose names only differ 
# in case and if your file system supports case sensitive file names. Windows 
# and Mac users are advised to set this option to NO.

CASE_SENSE_NAMES       = NO

# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
# will show members with their full class and namespace scopes in the 
# documentation. If set to YES the scope will be hidden.

HIDE_SCOPE_NAMES       = NO

# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
# will put a list of the files that are included by a file in the documentation 
# of that file.

SHOW_INCLUDE_FILES     = YES

# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
# is inserted in the documentation for inline members.

INLINE_INFO            = YES

# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
# will sort the (detailed) documentation of file and class members 
# alphabetically by member name. If set to NO the members will appear in 
# declaration order.

SORT_MEMBER_DOCS       = YES

# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
# brief documentation of file, namespace and class members alphabetically 
# by member name. If set to NO (the default) the members will appear in 
# declaration order.

SORT_BRIEF_DOCS        = NO

# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
# will sort the (brief and detailed) documentation of class members so that
# constructors and destructors are listed first. If set to NO (the default)
# the constructors will appear in the respective orders defined by
# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.

SORT_MEMBERS_CTORS_1ST = NO

# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
# hierarchy of group names into alphabetical order. If set to NO (the default) 
# the group names will appear in their defined order.

SORT_GROUP_NAMES       = NO

# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
# sorted by fully-qualified names, including namespaces. If set to 
# NO (the default), the class list will be sorted only by class name, 
# not including the namespace part. 
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
# Note: This option applies only to the class list, not to the 
# alphabetical list.

SORT_BY_SCOPE_NAME     = NO

# The GENERATE_TODOLIST tag can be used to enable (YES) or 
# disable (NO) the todo list. This list is created by putting \todo 
# commands in the documentation.

GENERATE_TODOLIST      = YES

# The GENERATE_TESTLIST tag can be used to enable (YES) or 
# disable (NO) the test list. This list is created by putting \test 
# commands in the documentation.

GENERATE_TESTLIST      = YES

# The GENERATE_BUGLIST tag can be used to enable (YES) or 
# disable (NO) the bug list. This list is created by putting \bug 
# commands in the documentation.

GENERATE_BUGLIST       = YES

# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
# disable (NO) the deprecated list. This list is created by putting 
# \deprecated commands in the documentation.

GENERATE_DEPRECATEDLIST= YES

# The ENABLED_SECTIONS tag can be used to enable conditional 
# documentation sections, marked by \if sectionname ... \endif.

ENABLED_SECTIONS       = 

# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
# the initial value of a variable or define consists of for it to appear in 
# the documentation. If the initializer consists of more lines than specified 
# here it will be hidden. Use a value of 0 to hide initializers completely. 
# The appearance of the initializer of individual variables and defines in the 
# documentation can be controlled using \showinitializer or \hideinitializer 
# command in the documentation regardless of this setting.

MAX_INITIALIZER_LINES  = 26

# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
# at the bottom of the documentation of classes and structs. If set to YES the 
# list will mention the files that were used to generate the documentation.

SHOW_USED_FILES        = YES

# If the sources in your project are distributed over multiple directories 
# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
# in the documentation. The default is NO.

SHOW_DIRECTORIES       = NO

# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
# This will remove the Files entry from the Quick Index and from the 
# Folder Tree View (if specified). The default is YES.

SHOW_FILES             = YES

# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
# and from the Folder Tree View (if specified). The default is YES.

SHOW_NAMESPACES        = YES

# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
# doxygen should invoke to get the current version for each file (typically from 
# the version control system). Doxygen will invoke the program by executing (via 
# popen()) the command <command> <input-file>, where <command> is the value of 
# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
# provided by doxygen. Whatever the program writes to standard output 
# is used as the file version. See the manual for examples.

FILE_VERSION_FILTER    = 

# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 
# doxygen. The layout file controls the global structure of the generated output files 
# in an output format independent way. The create the layout file that represents 
# doxygen's defaults, run doxygen with the -l option. You can optionally specify a 
# file name after the option, if omitted DoxygenLayout.xml will be used as the name 
# of the layout file.

LAYOUT_FILE            = 

#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------

# The QUIET tag can be used to turn on/off the messages that are generated 
# by doxygen. Possible values are YES and NO. If left blank NO is used.

QUIET                  = NO

# The WARNINGS tag can be used to turn on/off the warning messages that are 
# generated by doxygen. Possible values are YES and NO. If left blank 
# NO is used.

WARNINGS               = YES

# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
# automatically be disabled.

WARN_IF_UNDOCUMENTED   = YES

# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
# potential errors in the documentation, such as not documenting some 
# parameters in a documented function, or documenting parameters that 
# don't exist or using markup commands wrongly.

WARN_IF_DOC_ERROR      = YES

# This WARN_NO_PARAMDOC option can be abled to get warnings for 
# functions that are documented, but have no documentation for their parameters 
# or return value. If set to NO (the default) doxygen will only warn about 
# wrong or incomplete parameter documentation, but not about the absence of 
# documentation.

WARN_NO_PARAMDOC       = NO

# The WARN_FORMAT tag determines the format of the warning messages that 
# doxygen can produce. The string should contain the $file, $line, and $text 
# tags, which will be replaced by the file and line number from which the 
# warning originated and the warning text. Optionally the format may contain 
# $version, which will be replaced by the version of the file (if it could 
# be obtained via FILE_VERSION_FILTER)

WARN_FORMAT            = "$file:$line: $text"

# The WARN_LOGFILE tag can be used to specify a file to which warning 
# and error messages should be written. If left blank the output is written 
# to stderr.

WARN_LOGFILE           = 

#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------

# The INPUT tag can be used to specify the files and/or directories that contain 
# documented source files. You may enter file names like "myfile.cpp" or 
# directories like "/usr/src/myproject". Separate the files or directories 
# with spaces.

INPUT                  = /Users/jono/dev/lastfm-desktop

# This tag can be used to specify the character encoding of the source files 
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
# also the default input encoding. Doxygen uses libiconv (or the iconv built 
# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
# the list of possible encodings.

INPUT_ENCODING         = UTF-8

# If the value of the INPUT tag contains directories, you can use the 
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
# and *.h) to filter out the source-files in the directories. If left 
# blank the following patterns are tested: 
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90

FILE_PATTERNS          = *.c \
                         *.cc \
                         *.cxx \
                         *.cpp \
                         *.c++ \
                         *.d \
                         *.java \
                         *.ii \
                         *.ixx \
                         *.ipp \
                         *.i++ \
                         *.inl \
                         *.h \
                         *.hh \
                         *.hxx \
                         *.hpp \
                         *.h++ \
                         *.idl \
                         *.odl \
                         *.cs \
                         *.php \
                         *.php3 \
                         *.inc \
                         *.m \
                         *.mm \
                         *.dox \
                         *.py \
                         *.f90 \
                         *.f \
                         *.vhd \
                         *.vhdl

# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
# should be searched for input files as well. Possible values are YES and NO. 
# If left blank NO is used.

RECURSIVE              = YES

# The EXCLUDE tag can be used to specify files and/or directories that should 
# excluded from the INPUT source files. This way you can easily exclude a 
# subdirectory from a directory tree whose root is specified with the INPUT tag.

EXCLUDE                = /Users/jono/dev/lastfm-desktop/plugins \
                         /Users/jono/dev/lastfm-desktop/lib/3rdparty

# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
# directories that are symbolic links (a Unix filesystem feature) are excluded 
# from the input.

EXCLUDE_SYMLINKS       = NO

# If the value of the INPUT tag contains directories, you can use the 
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
# certain files from those directories. Note that the wildcards are matched 
# against the file with absolute path, so to exclude all test directories 
# for example use the pattern */test/*

EXCLUDE_PATTERNS       = moc_* \
                         qrc_* \
                         ui_*

# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
# (namespaces, classes, functions, etc.) that should be excluded from the 
# output. The symbol name can be a fully qualified name, a word, or if the 
# wildcard * is used, a substring. Examples: ANamespace, AClass, 
# AClass::ANamespace, ANamespace::*Test

EXCLUDE_SYMBOLS        = 

# The EXAMPLE_PATH tag can be used to specify one or more files or 
# directories that contain example code fragments that are included (see 
# the \include command).

EXAMPLE_PATH           = 

# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
# and *.h) to filter out the source-files in the directories. If left 
# blank all files are included.

EXAMPLE_PATTERNS       = *

# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
# searched for input files to be used with the \include or \dontinclude 
# commands irrespective of the value of the RECURSIVE tag. 
# Possible values are YES and NO. If left blank NO is used.

EXAMPLE_RECURSIVE      = NO

# The IMAGE_PATH tag can be used to specify one or more files or 
# directories that contain image that are included in the documentation (see 
# the \image command).

IMAGE_PATH             = 

# The INPUT_FILTER tag can be used to specify a program that doxygen should 
# invoke to filter for each input file. Doxygen will invoke the filter program 
# by executing (via popen()) the command <filter> <input-file>, where <filter> 
# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
# input file. Doxygen will then use the output that the filter program writes 
# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
# ignored.

INPUT_FILTER           = 

# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
# basis.  Doxygen will compare the file name with each pattern and apply the 
# filter if there is a match.  The filters are a list of the form: 
# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
# is applied to all files.

FILTER_PATTERNS        = 

# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
# INPUT_FILTER) will be used to filter the input files when producing source 
# files to browse (i.e. when SOURCE_BROWSER is set to YES).

FILTER_SOURCE_FILES    = NO

#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------

# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
# be generated. Documented entities will be cross-referenced with these sources. 
# Note: To get rid of all source code in the generated output, make sure also 
# VERBATIM_HEADERS is set to NO.

SOURCE_BROWSER         = NO

# Setting the INLINE_SOURCES tag to YES will include the body 
# of functions and classes directly in the documentation.

INLINE_SOURCES         = NO

# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
# doxygen to hide any special comment blocks from generated source code 
# fragments. Normal C and C++ comments will always remain visible.

STRIP_CODE_COMMENTS    = YES

# If the REFERENCED_BY_RELATION tag is set to YES 
# then for each documented function all documented 
# functions referencing it will be listed.

REFERENCED_BY_RELATION = NO

# If the REFERENCES_RELATION tag is set to YES 
# then for each documented function all documented entities 
# called/used by that function will be listed.

REFERENCES_RELATION    = NO

# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
# link to the source code.  Otherwise they will link to the documentation.

REFERENCES_LINK_SOURCE = YES

# If the USE_HTAGS tag is set to YES then the references to source code 
# will point to the HTML generated by the htags(1) tool instead of doxygen 
# built-in source browser. The htags tool is part of GNU's global source 
# tagging system (see http://www.gnu.org/software/global/global.html). You 
# will need version 4.8.6 or higher.

USE_HTAGS              = NO

# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
# will generate a verbatim copy of the header file for each class for 
# which an include is specified. Set to NO to disable this.

VERBATIM_HEADERS       = YES

#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------

# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
# of all compounds will be generated. Enable this if the project 
# contains a lot of classes, structs, unions or interfaces.

ALPHABETICAL_INDEX     = NO

# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
# in which this list will be split (can be a number in the range [1..20])

COLS_IN_ALPHA_INDEX    = 5

# In case all classes in a project start with a common prefix, all 
# classes will be put under the same header in the alphabetical index. 
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
# should be ignored while generating the index headers.

IGNORE_PREFIX          = 

#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------

# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
# generate HTML output.

GENERATE_HTML          = YES

# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
# put in front of it. If left blank `html' will be used as the default path.

HTML_OUTPUT            = html

# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
# doxygen will generate files with .html extension.

HTML_FILE_EXTENSION    = .html

# The HTML_HEADER tag can be used to specify a personal HTML header for 
# each generated HTML page. If it is left blank doxygen will generate a 
# standard header.

HTML_HEADER            = 

# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
# each generated HTML page. If it is left blank doxygen will generate a 
# standard footer.

HTML_FOOTER            = 

# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
# style sheet that is used by each HTML page. It can be used to 
# fine-tune the look of the HTML output. If the tag is left blank doxygen 
# will generate a default style sheet. Note that doxygen will try to copy 
# the style sheet file to the HTML output directory, so don't put your own 
# stylesheet in the HTML output directory as well, or it will be erased!

HTML_STYLESHEET        = 

# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
# files or namespaces will be aligned in HTML using tables. If set to 
# NO a bullet list will be used.

HTML_ALIGN_MEMBERS     = YES

# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
# documentation will contain sections that can be hidden and shown after the 
# page has loaded. For this to work a browser that supports 
# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).

HTML_DYNAMIC_SECTIONS  = NO

# If the GENERATE_DOCSET tag is set to YES, additional index files 
# will be generated that can be used as input for Apple's Xcode 3 
# integrated development environment, introduced with OSX 10.5 (Leopard). 
# To create a documentation set, doxygen will generate a Makefile in the 
# HTML output directory. Running make will produce the docset in that 
# directory and running "make install" will install the docset in 
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
# it at startup. 
# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.

GENERATE_DOCSET        = NO

# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
# feed. A documentation feed provides an umbrella under which multiple 
# documentation sets from a single provider (such as a company or product suite) 
# can be grouped.

DOCSET_FEEDNAME        = "Doxygen generated docs"

# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
# should uniquely identify the documentation set bundle. This should be a 
# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
# will append .docset to the name.

DOCSET_BUNDLE_ID       = org.doxygen.Project

# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
# will be generated that can be used as input for tools like the 
# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
# of the generated HTML documentation.

GENERATE_HTMLHELP      = NO

# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
# be used to specify the file name of the resulting .chm file. You 
# can add a path in front of the file if the result should not be 
# written to the html output directory.

CHM_FILE               = 

# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
# be used to specify the location (absolute path including file name) of 
# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
# the HTML help compiler on the generated index.hhp.

HHC_LOCATION           = 

# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
# controls if a separate .chi index file is generated (YES) or that 
# it should be included in the master .chm file (NO).

GENERATE_CHI           = NO

# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
# content.

CHM_INDEX_ENCODING     = 

# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
# controls whether a binary table of contents is generated (YES) or a 
# normal table of contents (NO) in the .chm file.

BINARY_TOC             = NO

# The TOC_EXPAND flag can be set to YES to add extra items for group members 
# to the contents of the HTML help documentation and to the tree view.

TOC_EXPAND             = NO

# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 
# are set, an additional index file will be generated that can be used as input for 
# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 
# HTML documentation.

GENERATE_QHP           = NO

# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
# be used to specify the file name of the resulting .qch file. 
# The path specified is relative to the HTML output folder.

QCH_FILE               = 

# The QHP_NAMESPACE tag specifies the namespace to use when generating 
# Qt Help Project output. For more information please see 
# http://doc.trolltech.com/qthelpproject.html#namespace

QHP_NAMESPACE          = 

# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
# Qt Help Project output. For more information please see 
# http://doc.trolltech.com/qthelpproject.html#virtual-folders

QHP_VIRTUAL_FOLDER     = doc

# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. 
# For more information please see 
# http://doc.trolltech.com/qthelpproject.html#custom-filters

QHP_CUST_FILTER_NAME   = 

# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see 
# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.

QHP_CUST_FILTER_ATTRS  = 

# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's 
# filter section matches. 
# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.

QHP_SECT_FILTER_ATTRS  = 

# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
# be used to specify the location of Qt's qhelpgenerator. 
# If non-empty doxygen will try to run qhelpgenerator on the generated 
# .qhp file.

QHG_LOCATION           = 

# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
# top of each HTML page. The value NO (the default) enables the index and 
# the value YES disables it.

DISABLE_INDEX          = NO

# This tag can be used to set the number of enum values (range [1..20]) 
# that doxygen will group on one line in the generated HTML documentation.

ENUM_VALUES_PER_LINE   = 4

# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
# structure should be generated to display hierarchical information. 
# If the tag value is set to YES, a side panel will be generated 
# containing a tree-like index structure (just like the one that 
# is generated for HTML Help). For this to work a browser that supports 
# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
# Windows users are probably better off using the HTML help feature.

GENERATE_TREEVIEW      = NO

# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
# and Class Hierarchy pages using a tree view instead of an ordered list.

USE_INLINE_TREES       = NO

# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
# used to set the initial width (in pixels) of the frame in which the tree 
# is shown.

TREEVIEW_WIDTH         = 250

# Use this tag to change the font size of Latex formulas included 
# as images in the HTML documentation. The default is 10. Note that 
# when you change the font size after a successful doxygen run you need 
# to manually remove any form_*.png images from the HTML output directory 
# to force them to be regenerated.

FORMULA_FONTSIZE       = 10

# When the SEARCHENGINE tag is enable doxygen will generate a search box
# for the HTML output. The underlying search engine uses javascript 
# and DHTML and should work on any modern browser. Note that when using
# HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) 
# there is already a search function so this one should typically 
# be disabled.

SEARCHENGINE           = NO

#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------

# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
# generate Latex output.

GENERATE_LATEX         = NO

# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
# put in front of it. If left blank `latex' will be used as the default path.

LATEX_OUTPUT           = latex

# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
# invoked. If left blank `latex' will be used as the default command name.

LATEX_CMD_NAME         = latex

# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
# generate index for LaTeX. If left blank `makeindex' will be used as the 
# default command name.

MAKEINDEX_CMD_NAME     = makeindex

# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
# LaTeX documents. This may be useful for small projects and may help to 
# save some trees in general.

COMPACT_LATEX          = NO

# The PAPER_TYPE tag can be used to set the paper type that is used 
# by the printer. Possible values are: a4, a4wide, letter, legal and 
# executive. If left blank a4wide will be used.

PAPER_TYPE             = a4wide

# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
# packages that should be included in the LaTeX output.

EXTRA_PACKAGES         = 

# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
# the generated latex document. The header should contain everything until 
# the first chapter. If it is left blank doxygen will generate a 
# standard header. Notice: only use this tag if you know what you are doing!

LATEX_HEADER           = 

# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
# contain links (just like the HTML output) instead of page references 
# This makes the output suitable for online browsing using a pdf viewer.

PDF_HYPERLINKS         = YES

# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
# plain latex in the generated Makefile. Set this option to YES to get a 
# higher quality PDF documentation.

USE_PDFLATEX           = YES

# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
# command to the generated LaTeX files. This will instruct LaTeX to keep 
# running if errors occur, instead of asking the user for help. 
# This option is also used when generating formulas in HTML.

LATEX_BATCHMODE        = NO

# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
# include the index chapters (such as File Index, Compound Index, etc.) 
# in the output.

LATEX_HIDE_INDICES     = NO

# If LATEX_SOURCE_CODE is set to YES then doxygen will include
# source code with syntax highlighting in the LaTeX output.
# Note that which sources are shown also depends on other settings
# such as SOURCE_BROWSER.

LATEX_SOURCE_CODE      = NO

#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------

# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
# The RTF output is optimized for Word 97 and may not look very pretty with 
# other RTF readers or editors.

GENERATE_RTF           = NO

# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
# put in front of it. If left blank `rtf' will be used as the default path.

RTF_OUTPUT             = rtf

# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
# RTF documents. This may be useful for small projects and may help to 
# save some trees in general.

COMPACT_RTF            = NO

# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
# will contain hyperlink fields. The RTF file will 
# contain links (just like the HTML output) instead of page references. 
# This makes the output suitable for online browsing using WORD or other 
# programs which support those fields. 
# Note: wordpad (write) and others do not support links.

RTF_HYPERLINKS         = NO

# Load stylesheet definitions from file. Syntax is similar to doxygen's 
# config file, i.e. a series of assignments. You only have to provide 
# replacements, missing definitions are set to their default value.

RTF_STYLESHEET_FILE    = 

# Set optional variables used in the generation of an rtf document. 
# Syntax is similar to doxygen's config file.

RTF_EXTENSIONS_FILE    = 

#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------

# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
# generate man pages

GENERATE_MAN           = NO

# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
# put in front of it. If left blank `man' will be used as the default path.

MAN_OUTPUT             = man

# The MAN_EXTENSION tag determines the extension that is added to 
# the generated man pages (default is the subroutine's section .3)

MAN_EXTENSION          = .3

# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
# then it will generate one additional man file for each entity 
# documented in the real man page(s). These additional files 
# only source the real man page, but without them the man command 
# would be unable to find the correct page. The default is NO.

MAN_LINKS              = NO

#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------

# If the GENERATE_XML tag is set to YES Doxygen will 
# generate an XML file that captures the structure of 
# the code including all documentation.

GENERATE_XML           = NO

# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
# put in front of it. If left blank `xml' will be used as the default path.

XML_OUTPUT             = xml

# The XML_SCHEMA tag can be used to specify an XML schema, 
# which can be used by a validating XML parser to check the 
# syntax of the XML files.

XML_SCHEMA             = 

# The XML_DTD tag can be used to specify an XML DTD, 
# which can be used by a validating XML parser to check the 
# syntax of the XML files.

XML_DTD                = 

# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
# dump the program listings (including syntax highlighting 
# and cross-referencing information) to the XML output. Note that 
# enabling this will significantly increase the size of the XML output.

XML_PROGRAMLISTING     = YES

#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------

# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
# generate an AutoGen Definitions (see autogen.sf.net) file 
# that captures the structure of the code including all 
# documentation. Note that this feature is still experimental 
# and incomplete at the moment.

GENERATE_AUTOGEN_DEF   = NO

#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------

# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
# generate a Perl module file that captures the structure of 
# the code including all documentation. Note that this 
# feature is still experimental and incomplete at the 
# moment.

GENERATE_PERLMOD       = NO

# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
# to generate PDF and DVI output from the Perl module output.

PERLMOD_LATEX          = NO

# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
# nicely formatted so it can be parsed by a human reader.  This is useful 
# if you want to understand what is going on.  On the other hand, if this 
# tag is set to NO the size of the Perl module output will be much smaller 
# and Perl will parse it just the same.

PERLMOD_PRETTY         = YES

# The names of the make variables in the generated doxyrules.make file 
# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
# This is useful so different doxyrules.make files included by the same 
# Makefile don't overwrite each other's variables.

PERLMOD_MAKEVAR_PREFIX = 

#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------

# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
# evaluate all C-preprocessor directives found in the sources and include 
# files.

ENABLE_PREPROCESSING   = YES

# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
# names in the source code. If set to NO (the default) only conditional 
# compilation will be performed. Macro expansion can be done in a controlled 
# way by setting EXPAND_ONLY_PREDEF to YES.

MACRO_EXPANSION        = NO

# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
# then the macro expansion is limited to the macros specified with the 
# PREDEFINED and EXPAND_AS_DEFINED tags.

EXPAND_ONLY_PREDEF     = NO

# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
# in the INCLUDE_PATH (see below) will be search if a #include is found.

SEARCH_INCLUDES        = YES

# The INCLUDE_PATH tag can be used to specify one or more directories that 
# contain include files that are not input files but should be processed by 
# the preprocessor.

INCLUDE_PATH           = 

# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
# patterns (like *.h and *.hpp) to filter out the header-files in the 
# directories. If left blank, the patterns specified with FILE_PATTERNS will 
# be used.

INCLUDE_FILE_PATTERNS  = 

# The PREDEFINED tag can be used to specify one or more macro names that 
# are defined before the preprocessor is started (similar to the -D option of 
# gcc). The argument of the tag is a list of macros of the form: name 
# or name=definition (no spaces). If the definition and the = are 
# omitted =1 is assumed. To prevent a macro definition from being 
# undefined via #undef or recursively expanded use the := operator 
# instead of the = operator.

PREDEFINED             = 

# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
# this tag can be used to specify a list of macro names that should be expanded. 
# The macro definition that is found in the sources will be used. 
# Use the PREDEFINED tag if you want to use a different macro definition.

EXPAND_AS_DEFINED      = 

# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
# doxygen's preprocessor will remove all function-like macros that are alone 
# on a line, have an all uppercase name, and do not end with a semicolon. Such 
# function macros are typically used for boiler-plate code, and will confuse 
# the parser if not removed.

SKIP_FUNCTION_MACROS   = YES

#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------

# The TAGFILES option can be used to specify one or more tagfiles. 
# Optionally an initial location of the external documentation 
# can be added for each tagfile. The format of a tag file without 
# this location is as follows: 
#   TAGFILES = file1 file2 ... 
# Adding location for the tag files is done as follows: 
#   TAGFILES = file1=loc1 "file2 = loc2" ... 
# where "loc1" and "loc2" can be relative or absolute paths or 
# URLs. If a location is present for each tag, the installdox tool 
# does not have to be run to correct the links. 
# Note that each tag file must have a unique name 
# (where the name does NOT include the path) 
# If a tag file is not located in the directory in which doxygen 
# is run, you must also specify the path to the tagfile here.

TAGFILES               = 

# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
# a tag file that is based on the input files it reads.

GENERATE_TAGFILE       = 

# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
# in the class index. If set to NO only the inherited external classes 
# will be listed.

ALLEXTERNALS           = NO

# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
# in the modules index. If set to NO, only the current project's groups will 
# be listed.

EXTERNAL_GROUPS        = YES

# The PERL_PATH should be the absolute path and name of the perl script 
# interpreter (i.e. the result of `which perl').

PERL_PATH              = /usr/bin/perl

#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------

# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
# or super classes. Setting the tag to NO turns the diagrams off. Note that 
# this option is superseded by the HAVE_DOT option below. This is only a 
# fallback. It is recommended to install and use dot, since it yields more 
# powerful graphs.

CLASS_DIAGRAMS         = NO

# You can define message sequence charts within doxygen comments using the \msc 
# command. Doxygen will then run the mscgen tool (see 
# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
# the mscgen tool resides. If left empty the tool is assumed to be found in the 
# default search path.

MSCGEN_PATH            = 

# If set to YES, the inheritance and collaboration graphs will hide 
# inheritance and usage relations if the target is undocumented 
# or is not a class.

HIDE_UNDOC_RELATIONS   = YES

# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
# available from the path. This tool is part of Graphviz, a graph visualization 
# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
# have no effect if this option is set to NO (the default)

HAVE_DOT               = YES

# By default doxygen will write a font called FreeSans.ttf to the output 
# directory and reference it in all dot files that doxygen generates. This 
# font does not include all possible unicode characters however, so when you need 
# these (or just want a differently looking font) you can specify the font name 
# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
# which can be done by putting it in a standard location or by setting the 
# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
# containing the font.

DOT_FONTNAME           = FreeSans

# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
# The default size is 10pt.

DOT_FONTSIZE           = 10

# By default doxygen will tell dot to use the output directory to look for the 
# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
# different font using DOT_FONTNAME you can set the path where dot 
# can find it using this tag.

DOT_FONTPATH           = 

# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
# will generate a graph for each documented class showing the direct and 
# indirect inheritance relations. Setting this tag to YES will force the 
# the CLASS_DIAGRAMS tag to NO.

CLASS_GRAPH            = YES

# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
# will generate a graph for each documented class showing the direct and 
# indirect implementation dependencies (inheritance, containment, and 
# class references variables) of the class with other documented classes.

COLLABORATION_GRAPH    = YES

# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
# will generate a graph for groups, showing the direct groups dependencies

GROUP_GRAPHS           = YES

# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
# collaboration diagrams in a style similar to the OMG's Unified Modeling 
# Language.

UML_LOOK               = NO

# If set to YES, the inheritance and collaboration graphs will show the 
# relations between templates and their instances.

TEMPLATE_RELATIONS     = NO

# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
# tags are set to YES then doxygen will generate a graph for each documented 
# file showing the direct and indirect include dependencies of the file with 
# other documented files.

INCLUDE_GRAPH          = YES

# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
# documented header file showing the documented files that directly or 
# indirectly include this file.

INCLUDED_BY_GRAPH      = YES

# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
# doxygen will generate a call dependency graph for every global function 
# or class method. Note that enabling this option will significantly increase 
# the time of a run. So in most cases it will be better to enable call graphs 
# for selected functions only using the \callgraph command.

CALL_GRAPH             = YES

# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
# doxygen will generate a caller dependency graph for every global function 
# or class method. Note that enabling this option will significantly increase 
# the time of a run. So in most cases it will be better to enable caller 
# graphs for selected functions only using the \callergraph command.

CALLER_GRAPH           = YES

# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
# will graphical hierarchy of all classes instead of a textual one.

GRAPHICAL_HIERARCHY    = YES

# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
# then doxygen will show the dependencies a directory has on other directories 
# in a graphical way. The dependency relations are determined by the #include 
# relations between the files in the directories.

DIRECTORY_GRAPH        = YES

# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
# generated by dot. Possible values are png, jpg, or gif 
# If left blank png will be used.

DOT_IMAGE_FORMAT       = png

# The tag DOT_PATH can be used to specify the path where the dot tool can be 
# found. If left blank, it is assumed the dot tool can be found in the path.

DOT_PATH               = 

# The DOTFILE_DIRS tag can be used to specify one or more directories that 
# contain dot files that are included in the documentation (see the 
# \dotfile command).

DOTFILE_DIRS           = 

# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
# nodes that will be shown in the graph. If the number of nodes in a graph 
# becomes larger than this value, doxygen will truncate the graph, which is 
# visualized by representing a node as a red box. Note that doxygen if the 
# number of direct children of the root node in a graph is already larger than 
# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.

DOT_GRAPH_MAX_NODES    = 50

# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
# graphs generated by dot. A depth value of 3 means that only nodes reachable 
# from the root by following a path via at most 3 edges will be shown. Nodes 
# that lay further from the root node will be omitted. Note that setting this 
# option to 1 or 2 may greatly reduce the computation time needed for large 
# code bases. Also note that the size of a graph can be further restricted by 
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.

MAX_DOT_GRAPH_DEPTH    = 0

# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
# background. This is disabled by default, because dot on Windows does not 
# seem to support this out of the box. Warning: Depending on the platform used, 
# enabling this option may lead to badly anti-aliased labels on the edges of 
# a graph (i.e. they become hard to read).

DOT_TRANSPARENT        = NO

# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
# files in one run (i.e. multiple -o and -T options on the command line). This 
# makes dot run faster, but since only newer versions of dot (>1.8.10) 
# support this, this feature is disabled by default.

DOT_MULTI_TARGETS      = NO

# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
# generate a legend page explaining the meaning of the various boxes and 
# arrows in the dot generated graphs.

GENERATE_LEGEND        = YES

# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
# remove the intermediate dot files that are used to generate 
# the various graphs.

DOT_CLEANUP            = YES


================================================
FILE: admin/dist/mac/AppleScriptSuite.sdef
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary xmlns:xi="http://www.w3.org/2001/XInclude" title="Last.fm Terminology">
	<!-- <xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/> -->
	<suite name="Last.fm Suite" code="Last" description="Last.fm Scripting Suite">
		<value-type name="Lastfm image" code="aImg" description="Image data in TIFF format">
			<cocoa class="NSData"/>
		</value-type>
		<class name="application" code="capp" description="The application&apos;s top-level scripting object.">
			<cocoa class="NSApplication"/>
			<property name="track title" code="aTtl" description="Title of currently playing track." type="text" access="r">
				<cocoa key="trackTitle"/>
			</property>
			<property name="artist" code="aArt" description="Artist of currently playing track." type="text" access="r"/>
			<property name="album" code="aAlb" description="Album of currently playing track." type="text" access="r"/>
			<property name="duration" code="aDur" description="Duration of currently playing track." type="integer" access="r"/>
			<property name="loved" code="aLov" description="The loved status of currently playing track." type="boolean" access="r"/>
			<property name="artwork" code="aAwk" description="Artwork for the currently playing track." access="r">
				<type type="Lastfm image"/>
			</property>
		</class>
		<command name="playpause" code="Lastplpa" description="Toggle playback between playing and paused.">
			<cocoa class="LastfmPlayPauseCommand"/>
		</command>
		<command name="next" code="Lastnext" description="Play the next track.">
			<cocoa class="LastfmNextCommand"/>
		</command>
		<command name="previous" code="Lastprev" description="Play the previous track.">
			<cocoa class="LastfmPrevCommand"/>
		</command>
		<command name="love" code="Lastlove" description="Love the current track.">
			<cocoa class="LastfmLoveCommand"/>
		</command>
		<command name="ban" code="Lastbann" description="Ban the current track.">
			<cocoa class="LastfmBanCommand"/>
		</command>
	</suite>
</dictionary>

================================================
FILE: admin/dist/mac/Growl Registration Ticket.growlRegDict
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
    <key>TicketVersion</key>
    <integer>1</integer>
    <key>AllNotifications</key>
    <array>
		<string>New track</string>
	</array>
	<key>DefaultNotifications</key>
    <array>
		<string>New track</string>
	</array>
</dict>
</plist>


================================================
FILE: admin/dist/mac/Standard.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleIconFile</key>
	<string>@ICON@</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleExecutable</key>
	<string>@EXECUTABLE@</string>
	<key>CFBundleIdentifier</key>
	<string>fm.last.Scrobbler</string>
	<key>CFBundleVersion</key>
	<string>2.1.39</string>
	<key>SUFeedURL</key>
	<string>https://cdn.last.fm/client/Mac/updates.xml</string>
	<key>SUEnableAutomaticChecks</key>
	<true/>
	<key>SUEnableSystemProfiling</key>
	<false/>
	<key>SUShowReleaseNotes</key>
	<true/>
	<key>SUScheduledCheckInterval</key>
	<integer>86400</integer>
	<key>SUAllowsAutomaticUpdates</key>
	<false/>
	<key>SUPublicDSAKeyFile</key>
	<string>dsa_pub.pem</string>
	<key>CFBundleDisplayName</key>
	<string>@EXECUTABLE@</string>
	<key>OSAScriptingDefinition</key>
	<string>AppleScriptSuite.sdef</string>
	<key>NSAppleScriptEnabled</key>
	<true/>
	<key>NSAppleEventsUsageDescription</key>
	<string>For Music and iTunes, this enables scrobbling. For Spotify, this lets you see Last.fm info about the currently playing song.</string>
	<key>BreakpadProduct</key>
	<string>@EXECUTABLE@</string>
	<key>BreakpadVendor</key>
	<string>@EXECUTABLE@</string>
	<key>BreakpadURL</key>
	<string>http://oops.last.fm/report/add</string>
	<key>BreakpadReportInterval</key>
	<string>30</string>
	<key>BreakpadRequestComments</key>
	<string>YES</string>
	<key>CFBundleName</key>
	<string>Last.fm Scrobbler</string>
	<key>NSHighResolutionCapable</key>
	<true/>
    <key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleURLName</key>
			<string>Last.fm</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>lastfm</string>
			</array>
		</dict>
	</array>
	<key>LSUIElement</key>
	<true/>
</dict>
</plist>


================================================
FILE: admin/dist/mac/build-release.rb
================================================
### Usage build-release.rb --deltas <version> <version> [--no-build] [--no-package]
# the deltas should be in a zip in the filder under bin with the expected filename format
# example /_bin/<version>/Last.fm-<version>
# TODO: download the previous versions from cdn and use that for the delta
#       there's no chance they'll be wrong then

require 'rexml/document'

# find the app version from the app's Info.plist
xml_data = File::read( "admin/dist/mac/Standard.plist" )

# extract event information
doc = REXML::Document.new(xml_data)

doc.elements.each('plist/dict/key') do |ele|
	if ele.text == "CFBundleVersion"
		$version = ele.next_element().text
	end
end

print "Building version #{$version}\n"

# get the delta versions from the command line
$deltas = []
deltasIndex = ARGV.index("--deltas")

if deltasIndex != nil
	while deltasIndex + 1 < ARGV.length and not ARGV.at( deltasIndex + 1 ).start_with?("--")
		deltasIndex = deltasIndex + 1
		print "Creating binary delta for version #{ARGV.at(deltasIndex)}\n"
		$deltas << ARGV.at(deltasIndex)
	end
end



$upload_folder = '/tmp/desktop_client_app_release/'
$download_folder = 'http://users.last.fm/~michael/client/Mac'

## Check that we are running from the root of the lastfm-desktop project
# ?

def clean
	## clean everything
	system 'make clean'
	system 'make distclean'
end

def build
	## build everything
	Dir.chdir("../liblastfm") do
		system "rm -rf _release"
		Dir.mkdir("_release")
		Dir.chdir("_release") do
			system 'cmake -D CMAKE_BUILD_TYPE:STRING=Release ..'
			system 'make -j8 install'
		end
	end

	system 'qmake -r CONFIG+=release'
	# Hack to fix the /Library/Framework includes
	system 'sed -i -e "s/-I-F/-F/g" lib/unicorn/Makefile'
	system 'make'

	system 'rm -rf _bin/Last.fm.app'
	system 'mv "_bin/Last.fm Scrobbler.app" _bin/Last.fm.app'
end

def copy_plugin
	## copy the iTunes plugin into the bundle
	system "cp -R _bin/Audioscrobbler.bundle '_bin/Last.fm.app/Contents/MacOS/'"
end

def sign_app
	# We need to fix the QT dependencies, as they are not in a state to be signed in El Capitan
	# and we're not upgrading to QT5 at the moment
	puts "======= Fixing Qt Framework and Codesigning ==========="
	Dir.foreach('_bin/Last.fm.app/Contents/Frameworks') do |framework|
		if framework.start_with?('Qt')
			puts "fixing #{framework} for codesigning"
			system "mkdir -p _bin/Last.fm.app/Contents/Frameworks/#{framework}/Versions/Current/Resources"
			system "mv _bin/Last.fm.app/Contents/Frameworks/#{framework}/Contents/Info.plist _bin/Last.fm.app/Contents/Frameworks/#{framework}/Versions/Current/Resources/Info.plist"
			system "rmdir _bin/Last.fm.app/Contents/Frameworks/#{framework}/Contents"
			system "rm _bin/Last.fm.app/Contents/Frameworks/#{framework}/*.prl"
		end
	end
	puts "signing application and bundled frameworks"
	system 'codesign -f --deep -s "Developer ID Application: Last.fm" -i fm.last.Scrobbler _bin/Last.fm.app'
end

def create_zip
	## create a zip file
	Dir.chdir("_bin") do
		system "rm -rf #{$version}"
		system "mkdir #{$version}"
		system "tar cjf #{$version}/Last.fm-#{$version}.tar.bz2 'Last.fm.app'"
		Dir.chdir("Last.fm.app/Contents") do
			system "tar cjf ../../#{$version}/Last.fm_Mac_Update_#{$version}.tar.bz2 *"
		end
		system "zip -ry #{$version}/Last.fm-#{$version}.zip 'Last.fm.app'"
	end
end

def create_deltas
	## create any deltas
	Dir.chdir("_bin") do
		# unzip the new app
		puts "unzipping #{$version}"
		system "unzip -q #{$version}/Last.fm-#{$version}.zip -d #{$version}"

		$deltas.each do |delta|
			# unzip the old version (try both compression formats)
			puts "unzipping #{delta}"
			#system 'tar -xjf Last.fm-#{delta}.tar.bz2 -C #{delta}'
			system "unzip -q #{delta}/Last.fm-#{delta}.zip -d #{delta}"
			# create the delta
			system "./BinaryDelta create #{delta}/Last.fm.app #{$version}/Last.fm.app #{$version}/Last.fm-#{$version}-#{delta}.delta"
			# check that it worked
			system "./BinaryDelta apply #{delta}/Last.fm.app #{$version}/Last.fm.app #{$version}/Last.fm-#{$version}-#{delta}.delta"
			# remove the unzipped old version
			system "rm -rf #{delta}/Last.fm.app"
		end

		# delete the unzipped new app
		system "rm -rf #{$version}/Last.fm.app"
	end
end

def upload_files
	# scp the main zip file
	# scp all the deltas
	# put them in my userhome if we are doing a test update

	system "cp _bin/#{$version}/Last.fm-#{$version}.tar.bz2 #{$upload_folder}"
	system "cp _bin/#{$version}/Last.fm_Mac_Update_#{$version}.tar.bz2 #{$upload_folder}"
	system "cp _bin/#{$version}/Last.fm-#{$version}.zip #{$upload_folder}"

	$deltas.each do |delta|
		system "scp _bin/#{$version}/Last.fm-#{$version}-#{delta}.delta badger:#{$upload_folder}"
	end
end

def generate_appcast_xml
	## sign the zip file and deltas

	File.open("update.xml", 'w') do |f|

		item = "<item>\n"
		item << "\t<title>#{$version}</title>\n"
		item << "\t<pubDate></pubDate>\n"

		version_sig = `ruby admin/dist/mac/sign_update.rb _bin/#{$version}/Last.fm-#{$version}.tar.bz2 admin/dist/mac/dsa_priv.pem`.strip
		version_size = `du _bin/#{$version}/Last.fm-#{$version}.tar.bz2`.split[0]

		item << "\t<enclosure\n\t\tsparkle:version=\"#{$version}\"\n\t\turl=\"#{$download_folder}/Last.fm-#{$version}.tar.bz2\"\n\t\tlength=\"#{version_size}\"\n\t\ttype=\"application/octet-stream\"\n\t\tsparkle:dsaSignature=\"#{version_sig}\"/>\n"
		item << "\t<sparkle:deltas>\n"

		$deltas.each do |delta|
			delta_sig = `ruby admin/dist/mac/sign_update.rb _bin/#{$version}/Last.fm-#{$version}-#{delta}.delta admin/dist/mac/dsa_priv.pem`.strip
			delta_du = `du _bin/#{$version}/Last.fm-#{$version}-#{delta}.delta`.split[0]
			item << "\t\t<enclosure\n\t\t\turl=\"#{$download_folder}/Last.fm-#{$version}-#{delta}.delta\"\n\t\t\tsparkle:version=\"#{$version}\"\n\t\t\tsparkle:deltaFrom=\"#{delta}\"\n\t\t\tlength=\"#{delta_du}\"\n\t\t\ttype=\"application/octet-stream\"\n\t\t\tsparkle:dsaSignature=\"#{delta_sig}\"/>\n"
		end

		item << "\t</sparkle:deltas>\n"
		item << "\t<description></description>\n"
		item << "</item>\n"

		f.syswrite item
	end
end

if not ARGV.include?( "--no-build" )
	# build the app
	clean
	build
	copy_plugin
	sign_app
end
if not ARGV.include?( "--no-package" )
	# package and upload the app
	create_zip
	create_deltas
	upload_files
	generate_appcast_xml
end



================================================
FILE: admin/dist/mac/bundleFrameworks.sh
================================================
#!/bin/bash
# Author: Jono Cole <jono@last.fm>
#
# A tool for distributing Mac OSX bundles.
#
# Finds and copies dependant frameworks and local dylibs 
# not installed on stardard systems.
# Also ensures that all binaries have the correct paths 
# installed relative to the bundle's @executable_path

function getBundleBin {
    if echo $1|grep -q framework; then
        echo $1/`cat "$1/Contents/Info.plist" | sed -n '/CFBundleExecutable<\/key>/,/<\/string>/ s/.*<string>\(.*\)<.*/\1/p'|sed s/_debug//`
    else
        echo $1/Contents/MacOS/`cat "$1/Contents/Info.plist" | sed -n '/CFBundleExecutable<\/key>/,/<\/string>/ s/.*<string>\(.*\)<.*/\1/p'`
    fi
}

function fixFrameworks {
    echo -n F
    if [ -d "$1" ]; then
        local bin="`getBundleBin "$1"`"
    else
        local bin="$1"
    fi

    # echo Fixing Frameworks for $bin

    libs=`otool -L "$bin"|sed -n '/\/usr\/local.*/ s/^[^\/]*\([^(]*\) [^(]*([^)]*)/\1/p'`
    
    mkdir -p "$bundlePath/Contents/Frameworks"

    local lib
    for lib in $libs; do
        #ignore non-frameworks
        if echo $lib | grep -vq framework; then continue; fi

        #examples for /opt/qt/lib/QtXml.framework/Contents/QtXml

        #framework=/opt/qt/qt.git/lib/QtXml.framework
        framework=`echo $lib |sed -n 's/\(\.framework\).*/\1/p'`
        
        #frameworkLib=/Contents/QtXml
        frameworkLib=`echo $lib |sed -n 's/^.*\.framework//p'`

        #frameworkName=QtXml.framework
        frameworkName=`basename $framework`
        
        destFramework=$bundlePath/Contents/Frameworks/$frameworkName
        installFramework=@executable_path/../Frameworks/$frameworkName
        
        if [ "`basename $lib`" == "`basename $bin`" ]; then continue; fi

        if [ ! -e "$bundlePath/Contents/Frameworks/$frameworkName" ]; then 
            #cp -Rf -P /opt/qt/qt.git/lib/QtXml.framework (app name.app)/Contents/Frameworks
            cp -R -H -f $framework "$bundlePath/Contents/Frameworks"
            chmod -R u+w "$bundlePath/Contents/Frameworks"

            #install_name_tool -id /opt/qt/qt.git/lib/QtXml.framework/Contents/QtXml
            install_name_tool -id $installFramework$frameworkLib "$destFramework$frameworkLib"
        fi
        #install_name_tool -change /opt/qt/qt.git/lib/QtXml.framework/Contents/QtXml @executable_path/../Frameworks/QtXml.framework/Contents/QtXml (bin)
        install_name_tool -change $lib $installFramework$frameworkLib "$bin"
        fixLocalLibs "$destFramework"
        fixFrameworks "$destFramework"
    done
}

function fixLocalLibs {
    echo -n L
    if [ -d "$1" ]; then
        local bin=`getBundleBin "$1"`
    else
        local bin="$1"
    fi
    echo Fixing Local Lib for $bin

    local libs=`otool -L "$bin" | sed -n '/^[^\/]*$/ s/^[[:space:]]*\(.*\) (com.*/\1/p'`
    local extralibs=`otool -L "$bin" | sed -n '/\/usr\/local.*/ s/^[^\/]*\([^(]*\) [^(]*([^)]*)/\1/p'|grep -v framework`
    local moreExtralibs=`otool -L "$bin" | sed -n '/\/usr\/X11.*/ s/^[^\/]*\([^(]*\) [^(]*([^)]*)/\1/p'|grep -v framework`
    local libs="$libs $extralibs $moreExtralibs"
    local lib
    local cpPath
    for lib in $libs; do
        local libPath=$lib
        if [ ! -e $lib ]; then
            cpPath=`locateLib $lib`
        else
            cpPath=$lib
        fi

        resolvedLib=`/usr/local/bin/greadlink -f $cpPath`
        basenameLib=`basename $resolvedLib`

		echo $cpPath "$bundlePath/Contents/MacOS"

        cp -RLf $resolvedLib "$bundlePath/Contents/MacOS/"

        chmod -R u+w "$bundlePath/Contents/MacOS"

        install_name_tool -id @executable_path/../MacOS/$basenameLib "$bundlePath/Contents/MacOS/$basenameLib"
        install_name_tool -change $libPath @executable_path/../MacOS/$basenameLib "$bin"
        
        fixFrameworks "$bundlePath/Contents/MacOS/$basenameLib"
        fixLocalLibs "$bundlePath/Contents/MacOS/$basenameLib"
    done
}

function locateLib {
    for p in {$rootdir,/usr/local/lib}; do
        if [ -e $p/$1 ]; then
            echo $p/$1
            return 0
        fi
    done
    return 1
}

if [ -d '$1' ]; then
    bundlePath="$1"
else
    bundlePath=$(echo $1 | sed -E "s|^(.*)\.app.*$|\1\.app|g")
fi

rootdir=`dirname "$bundlePath"`
binPath=$bundlePath/Contents/MacOS

echo =========== Fix Local Libs ==============
if [ -d '$1' ]; then
    fixLocalLibs "$bundlePath"
else
    fixLocalLibs "$1"
fi

echo

echo =========== Fix Frameworks ==============
if [ -d '$1' ]; then
    fixFrameworks "$bundlePath"
else
    fixFrameworks "$1"
fi

echo

echo ======= Copying 3rd party frameworks ===========

cp -R -H -f /Library/Frameworks/Growl.framework "$bundlePath/Contents/Frameworks"
cp -R -H -f /Library/Frameworks/Sparkle.framework "$bundlePath/Contents/Frameworks"
#cp -R -L -f /Library/Frameworks/Breakpad.framework "$bundlePath/Contents/Frameworks"

echo

echo ======= Copying Qt plugins ===========
mkdir -p "$bundlePath/Contents/plugins"

plugins="imageformats sqldrivers bearer"

for plugin in $plugins; do
    if [ -d /Developer/Applications/Qt/plugins/ ]; then
        pluginDir=/Developer/Applications/Qt/plugins
    elif [ -d /usr/local/lib/qt4/plugins/ ]; then
        # Qt installed using Homebrew will be found in your local lib.
        # Currently we only support qt v4.8.7.
        pluginDir=/usr/local/lib/qt4/plugins
    else
        pluginDir=`qmake --version |sed -n 's/^.*in \(\/.*$\)/\1/p'`/../plugins
    fi
    cp -v -R -L -f $pluginDir/$plugin "$bundlePath/Contents/plugins"
    chmod -R -v u+w "$bundlePath/Contents/plugins"
    for i in "$bundlePath"/Contents/plugins/$plugin/*; do
        fixFrameworks "$i"
        fixLocalLibs "$i"
        echo -n P
    done
    echo
done

echo ======= Copying Qt translations ===========
mkdir -p "$bundlePath/Contents/Resources/qm"

translations="qt_de.qm
                qt_es.qm 
                qt_fr.qm 
                qt_ja.qm 
                qt_pl.qm 
                qt_pt.qm 
                qt_ru.qm 
                qt_sv.qm 
                qt_zh_CN.qm"

for translation in $translations; do
    if [ -d /Developer/Applications/Qt/plugins/ ]; then
        translationDir=/Developer/Applications/Qt/translations
    elif [ -d /usr/local/Cellar/qt@4/4.8.7_5/translations/ ]; then
        # Qt installed using Homebrew will be found in the Homebrew Cellar.
        # Currently we only support qt v4.8.7.
        translationDir=/usr/local/Cellar/qt@4/4.8.7_5/translations
    else
        translationDir=`qmake --version |sed -n 's/^.*in \(\/.*$\)/\1/p'`/../translations
    fi

    cp -v -f $translationDir/$translation "$bundlePath/Contents/Resources/qm"
    echo
done


echo ======= creating qt.conf ===========
qtconf=$bundlePath/Contents/Resources/qt.conf
echo [Paths] > "$qtconf"
echo Plugins = ../plugins >> "$qtconf"


================================================
FILE: admin/dist/mac/dsa_pub.pem
================================================
-----BEGIN PUBLIC KEY-----
MIIDPDCCAi4GByqGSM44BAEwggIhAoIBAQDagjvSe6+JNNvHjB6aWriA6YXnVdqS
s//YkmhwiCwkHGk0set/4P4IZbl2xkpd/hyo9qQnnhjou0llHOaljU8Yp6g61lt9
n/BhlhPt7tvBkTtsugJ4YIRkaakzscLUIoeHneF8D3B3Ej2xoZ734Rq/LDc9jZgd
UNjS+sZec69waEp2ikcmkvfAbZ0yPHHhl0xftaA0A9OqaBBDUyxiBOqWfLQexj9L
DHlx38kGy3lsuqY9DQQ0BbIv24QKDWDFf9GD/TEXgVOBAiIC4cGVUh2JgQVAZ0nk
86pwavc1uIPynTyje902MI0ojFPLuhuod7QAO9NNBFD3024n+uv7mPi5AhUAqo2v
msdlE3NsONzW4uBVGujvNNUCggEBANlg+4w6ikFI8agyolAl9YepP0dcwk33MSXY
2Plwqp/41yIpFzb9qp0QKjfmtwy+cAdWcVcN8xKM9MghVgTukttdV9Rz8fwnfHAa
QMoYVhHBNDaipR0RRpx+NPnMkKPrYiH1+J4C8/MYAsDEB0xa7Vv/EasA0yWD3mhK
ydm9O2Njj1J2ZEQ4Nz+9ba7wDLpZVM/P9fitZalVyWxFVPxhYs3ifUSCgE+fYGR2
VBiwBZiQ8uKf+yJpmYQkUA4/h54S2hiCQHrSS9A9L0Ekdj+Jy07lPGv6IAlhzcfQ
OyiNzmbEgsR8LLo6H54/JxTwElt/TsdpWP8n83l4KFVN00eAZSgDggEGAAKCAQEA
us92grNvv1zRXmBpsEPPhy5hGhcslBy5ZWygUytgwupjq8MkpkD3yez649qVTUAt
E4SJUW+6EKbcLZSBRBdMWZNwudrHCly4n6OMOh4ZqHDA2YQFqMFnLaOHMBxHDU7b
YiBPYxjHlm7yBXTnXIVqOnts3yRPRfHUCvNdiMvNzLQaDtP343jew2W4R8arwFpC
U01NbHWoOiQ6GggTJEfGIxTHhjkd5Xd0hB97KccPF4YvOTGnXpNiHN+hGteF2CrZ
pZAyYIqshyeijR9ipbOpYxdrYOGKfA5nUSDjeGpG2Yqg6R6eJrrBw49JsJP6VqhD
VM0wmv7fyfPZHD/g9CAx0w==
-----END PUBLIC KEY-----


================================================
FILE: admin/dist/mac/sign_update.rb
================================================
#!/usr/bin/ruby
if ARGV.length < 2
  puts "Usage: ruby sign_update.rb update_archive private_key"
  exit
end
openssl = "/usr/bin/openssl"
puts `#{openssl} dgst -sha1 -binary < "#{ARGV[0]}" | #{openssl} dgst -dss1 -sign "#{ARGV[1]}" | #{openssl} enc -base64`

================================================
FILE: admin/dist/updates/Changelog.txt
================================================
The changelog is publicly places into the update files, which live on cdn.last.fm. Add your changes there.

Note that build-release.rb will output a stub Sparkle update XML block (called update.xml in the project root) to be added to various files here (beta, then release versions) which is correctly signed with our dsa_priv.pem key. You must incorporate this into the update XMLs.

================================================
FILE: admin/dist/updates/Mac/updates.xml
================================================
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Last.fm Scrobbler Updates</title>
	<link>https://cdn.last.fm/client/Mac/updates.xml</link>
	<description>Last.fm Scrobbler Updates - Mac</description>
	<language>en</language>
	<item>
		<title>Last.fm Scrobbler 2.1.39</title>
		<pubDate>Wed, 18 Sep 2019 16:26:00 +0100</pubDate>
		<enclosure
			sparkle:version="2.1.39"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.39.tar.bz2"
			length="76296"
			type="application/octet-stream"
			sparkle:dsaSignature="MC0CFQCmOcvAMz+PoMNOsNMP22ggfjFyzgIUVgXjj2WdaQmM/S7HFxsXR3iAHGQ="/>
		<sparkle:deltas>
		</sparkle:deltas>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>This update ensures that scrobbling continues to work with Mac OS Catalina. It is now compatible with the Music app, which was formerly known as iTunes.</li>
				</ul>
				<h3>Bug Fixes</h3>
				<ul>
					<li>The link to activate scrobbling in Spotify has been fixed. You can add scrobbling for Spotify through your Last.fm <a href="https://www.last.fm/settings/applications">settings page</a>.</li>
				</ul>
				]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.37</title>
		<pubDate>Tue, 22 Mar 2016 15:31:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.37"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.37.tar.bz2"
			length="56792"
			type="application/octet-stream"
			sparkle:dsaSignature="MC0CFFQ7XARhNXoLR504/gd+D5gXazP0AhUAkjA63yXEafvxMm+PH07DYwlOm1I="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>This is mainly a security update for OSX El Capitan to allow loading of all future updates over HTTPS.</li>
					<li>This update also removes some unused functions of the client.</li>
				</ul>
				<h3>Bug Fixes</h3>
				<ul>
					<li>Some users were experiencing crashes on sleep/wake. This should be fixed.</li>
				</ul>
				]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.36</title>
		<pubDate>Tue, 03 Sep 2013 12:14:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.36"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.36.tar.bz2"
			length="51752"
			type="application/octet-stream"
			sparkle:dsaSignature="MC0CFFZ5FiReyWRw5dPD42JBuv/R6dJZAhUAqTyhf6TS6ITk+bKOFBxPRlpmKBg="/>
		<sparkle:deltas>
			<enclosure
				url="https://cdn.last.fm/client/Mac/Last.fm-2.1.36-2.1.35.delta"
				sparkle:version="2.1.36"
				sparkle:deltaFrom="2.1.35"
				length="14048"
				type="application/octet-stream"
				sparkle:dsaSignature="MCwCFAWzRcmOvVQYogpm82Mp1fM1ITCcAhR1McMEgB5xCNv4LnOdHFrzFB6tjA=="/>
		</sparkle:deltas>
		<description><![CDATA[
			<h3>Features</h3>
			<ul>
				<li>New playback controls and progress bar design!</li>
			</ul>
			<h3>Bug fixes</h3>
			<ul>
				<li>iPod scrobbles with multiple plays are now submitted at 1 second intervals instead of all at the same time</li>
				<li>Fingerprinting is fixed and back - it's now also in a different process so fingerprinting problems don't bring down the whole app (just a precaution)</li>
				<li>Fixed some memory leaks</li>
				<li>Scrobble count on profile tab now updated correctly (unless you scrobble elsewhere)</li>
				<li>Do not display corrections in the client (it wasn't respecting the website setting and was causing a few issues)</li>
				<li>'Similar Artist' header in the track metadata view is now a link to more similar artists on the site</li>
				<li>There is now a warning/explanation in the iPod scrobble confirmation dialog when you have red/invalid iPod scrobbles</li>
				<li>Now shows the correct modifier keys on Windows for the raise/hide Scrobbler option</li>
				<li>Mute now works from the system tray and menu option</li>
				<li>The last page of the wizard now doesn't say we've imported your listening history, if we haven't</li>
				<li>Fixed an issue where the tray icon would be invisible if the first run wizard tour was skipped</li>
				<li>Less logging (there was an issue with log file sizes getting very big)</li>
			</ul>
			]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.35</title>
		<pubDate>Wed, 06 Mar 2013 10:43:00 +0000</pubDate>
		<enclosure
		sparkle:version="2.1.35"
		url="https://cdn.last.fm/client/Mac/Last.fm-2.1.35.tar.bz2"
		length="38768"
		type="application/octet-stream"
		sparkle:dsaSignature="MCwCFFG28YT06hPjBcVJMIfevbCA9VZ7AhQ4aA9lp8cIv3HcPA7Smtvzz/mAyA=="/>
		<sparkle:deltas>
			<enclosure
				url="https://cdn.last.fm/client/Mac/Last.fm-2.1.35-2.1.34.delta"
				sparkle:version="2.1.35"
				sparkle:deltaFrom="2.1.34"
				length="904"
				type="application/octet-stream"
				sparkle:dsaSignature="MCwCFCtPKeOs9zB2edu4OD9mQlt/za2UAhQ6U9LMoWL0I3znzVBSlILIDCoaew=="/>
		</sparkle:deltas>
		<description><![CDATA[
			<h3>Features</h3>
			<ul>
				<li>Exclude directories! You can now exclude music in certain directories from being scrobbled</li>
				<li>Systray/menu bar icon is greyed out when scrobbling is disabled</li>
				<li>Users can now hide both the dock icon and the menu bar icon (restart only required when hiding dock icon on 10.6)</li>
				<li>Binary delta updates will be supported from the release after this one</li>
				<li>[Experimental] Added the ability to use SSL for all web services calls</li>
			</ul>
			<h3>Bug fixes</h3>
			<ul>
				<li>Fingerprinting was causing crashes so has been temporarily disabled until we find a proper fix</li>
				<li>Fixed an issue where it was possible to get two running versions of the applications after an update. <b>Please note</b> that as this fix was to the update mechanism it will only be corrected in the update after this one so please make sure you don't have two versions of the app running after this update.</li>
				<li>Device scrobbling improvements</li>
				<ul>
					<li>We now force that a compatible iTunes plugin version is installed before trying to device scrobble</li>
					<li>Prompt to install the new plugin has been improved</li>
				</ul>
				<li>Don't crash if Airfoil is connected during the first run wizard</li>
				<li>Tracks now get their scrobble and loved status updated when the scrobble list is refreshed</li>
				<li>Fixed scrobbling problems associated with setting the scrobble point to 100%</li>
				<ul>
					<li>Fixed double scrobble and missed scrobbles</li>
					<li>There's now a setting to turn of the maximum scrobble point being 4 minutes</li>
					<li>Scrobble point and max scrobble turn off now take effect during the current track</li>
				</ul>
			</ul>
			<p><a class="more" href="https://cdn.last.fm/client/updates/updates.html>Full changelog</a></p>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.33</title>
		<pubDate>Thr, 24 Jan 2013 11:00:00 +0000</pubDate>
		<enclosure
				sparkle:version="2.1.33"
				url="https://cdn.last.fm/client/Mac/Last.fm-2.1.33.tar.bz2"
				length="51496"
				type="application/octet-stream"
				sparkle:dsaSignature="MCwCFDb/I9Bxyigl2lBJw+JiFwmvnzZnAhQf/Ua3boCkXB1uH2eLpJEC83Zhlg=="/>
		<description><![CDATA[
					<ul>
						<li>Users that only authenticated with 2.1.32 will be asked to authenticate again. Sorry!</li>
						<li>First run wizard's continue button no longer gets stuck</li>
					</ul>
					<h3>Bug fixes from 2.1.32</h3>
					<ul>
						<li>All users should now be able to authenticate - changed to a simpler authentication mechanism</li>
						<li>Added a beta updates option - warning: only for the brave!</li>
						<li>Fixed some minor account bootstrap issues</li>
						<li>Open 'media player' links now work on Windows</li>
					</ul>
					<a class="more" href="https://cdn.last.fm/client/updates/updates.html">Full changelog</a>
		]]></description>
	</item>
<!--
 	<item>
		<title>Last.fm Scrobbler 2.1.32 BROKEN! DOWNLOAD DISABLED!</title>
		<pubDate>Tue, 22 Jan 2013 13:48:00 +0000</pubDate>
		<description><![CDATA[
			This block was commented out as it breaks later versions of Sparkle.
		]]></description>
	</item>
 -->
 	<item>
		<title>Last.fm Scrobbler 2.1.30</title>
		<pubDate>Mon, 14 Jan 2013 16:20:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.30"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.30.tar.bz2"
			length="51488"
			type="application/octet-stream"
			sparkle:dsaSignature="MC0CFB81slNAjFgUeLzRzduBcPn5Gf4pAhUApgKlc0e88mKviG7b7Sv8l96FooQ="/>
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Translations updated and complete</li>
					<li>Don't fingerprint files from audio CDs</li>
					<li>Fixed some problems upgrading from The Scrobbler 1.x</li>
					<li>Fixed a crash when enabling/disabling device scrobbling</li>
					<li>Fixed a crash when switching user accounts</li>
					<li>A temporary workaround for an device scrobbling error</li>
				</ul>
		]]></description>
	</item>	
	<item>
		<title>Last.fm Scrobbler 2.1.29</title>
		<pubDate>Mon, 14 Jan 2013 12:00:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.29"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.29.tar.bz2"
			length="51496"
			type="application/octet-stream"
			sparkle:dsaSignature="MCwCFHT3/y44rhssHuDtfmt5rL+3Ww6eAhRXpdFTCf731RywSz2rK0ItHCmuzA=="/>
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Translations updated and complete</li>
					<li>Don't fingerprint files from audio CDs</li>
					<li>Fixed some problems upgrading from The Scrobbler 1.x</li>
					<li>Fixed a crash when enableing/disabling device scrobbling</li>
					<li>Fixed a crash when switching user accounts</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.28</title>
		<pubDate>Tue, 08 Jan 2013 11:30:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.28"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.28.tar.bz2"
			length="51480"
			type="application/octet-stream"
			sparkle:dsaSignature="MCwCFDwayTlkMI06J0RSHrRulFniTT3VAhRq4XJxuw8oVXBXTZkBb6Lt8nR57g=="/>
		<description><![CDATA[
				<h3>Changes</h3>
				<ul>
					<li>Side bar images updated slightly</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Restore the main window size and position correctly after restart</li>
					<li>Fixed a crash caused by VLC when monitors plugged in, etc</li>
					<li>Fixed spurious device scrobbles caused by a race condition</li>
					<li>Fixed triple scrobbling when scrobbling offline cached scrobbles</li>
					<li>Don't run the device scrobble checker so often - it was running almost all the time on Windows</li>
					<li>Device scrobble performance improvements</li>
					<li>Minimize and Zoom menu options now work</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.27</title>
		<pubDate>Fri, 21 Dec 2012 15:30:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.27"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.27.tar.bz2"
			length="51280"
			type="application/octet-stream"
			sparkle:dsaSignature="MCwCFFdVhVVxkTyH7dcmJD+OLXACK5kgAhQcLYsjGQSRxcONf6VGPUrxPRKUqg=="/>
		<sparkle:deltas>
		</sparkle:deltas>
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed a crash on startup for new users</li>
					<li>Fixed iTunes plays being picked up as device scrobbles Windows (may improve Mac too)</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.26</title>
		<pubDate>Mon, 17 Dec 2012 12:15:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.26"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.26.tar.bz2"
			length="50456"
			type="application/octet-stream"
			sparkle:dsaSignature="MCwCFEB1oHQYNVi+HQXxSt6xGn/mzsr4AhR+vrS/dxoDvCqQyN51HypLawcucw=="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Translations! (almost complete)</li>
					<li>Proxy settings - you can set them from the advanced settings tab and the first step of first run wizard</li>
					<li>Text should now look nicer on Retina screens</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>iPod scrobbling - fixed a problem where non-local tracks (iTunes Match) would not get their playcounts synced and lead to duplicates scrobbles</li>
					<li>Media keys are now ignored if you last listened to audio through another app</li>
					<li>Don't divide by zero (crash) for users that are using the app on the same day as they registered</li>
					<li>Fixed restarting the app in Mac, still not working on Windows.</li>
					<li>Radio now goes into the stopped state correctly</li>
					<li>Device scrobble Window is now a child of the main window (it appears positioned on top of it nicely now)</li>
					<li>Fixed a double delete crash when the fingerprinter failed</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.25</title>
		<pubDate>Thr, 25 Oct 2012 13:20:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.25"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.25.tar.bz2"
			length="49704"
			type="application/octet-stream"
			sparkle:dsaSignature="MCwCFCX24RpRaDjf5+luL4aSX7Uqhz/gAhRulwjHFesGWsIJrSNoRCrvixbiUg=="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Now called "Last.fm Scrobbler"</li>
					<li>iPod scrobbling has been reworked to allow for WiFi sync - Scrobble your device before updating so you don't lose scrobbles</li>
					<li>The app is now partially translated with translations from the old app. A fully translated version will be coming soon</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Some CPU usage fixes</li>
					<li>Fingerprinting backend has changed, fixing a rare crash</li>
					<li>Other minor bugs</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.21</title>
		<pubDate>Mon, 10 Sep 2012 10:26:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.1.21"
			url="https://cdn.last.fm/client/Mac/Last.fm-2.1.21.tar.bz2"
			length="28528"
			type="application/octet-stream"
			sparkle:dsaSignature="MCwCFFQ3ZyY6bowbSgQHih7rwDP/zasoAhRJrKkzhmeV/hrOIP+qVmmxPn1svw=="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Added option to hide app icon from the dock (also has to hide app's menu bar, and icon in tab switcher)</li>
					<li>We now scrobble 'album artist' as well as 'artist' for cleaner album pages on the website (all plugins have been updated)</li>
					<li>Fingerprinting local tracks has been added (can be turned off in preferences)</li>
					<li>"Scrobbling is off" message has been added to the status bar</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Better album images in the scrobble list</li>
					<li>We now only ask you to install plugins for apps we've detected you've installed</li>
					<li>We now make sure you close your media players before plugins are installed</li>
					<li>We now make sure you close WMP or Winamp before bootstrapping (won't bootstrap if they are left open)</li>
					<li>Profile widget now refreshed when you switch to it so data doesn't get as out of date</li>
					<li>Fixed some bugs in the preferences dialog</li>
				</ul>
		]]></description>
	</item>
	<item>
	<title>Last.fm Scrobbler 2.1.20</title>
        <pubDate>Fri, 01 Jun 2012 14:20:00 +0000</pubDate>
        <enclosure
                sparkle:version="2.1.20"
                url="https://cdn.last.fm/client/Mac/Last.fm-2.1.20.tar.bz2"
                length="24088"
                type="application/octet-stream"
                sparkle:dsaSignature="MCwCFDXdsIAA9RR+fm1HASw9Wj9faEENAhQcojkXrhPuK3a19Pc1vyOLfGRRiA=="/>
        <description><![CDATA[
        		<h3>Bug fixes</h3>
        		<ul>
					<li>Fixed some radio playback issues introduced with the switch to VLC</li>
				</ul>
		    ]]></description>
	</item>
	<item>
        <title>Last.fm Scrobbler 2.1.19</title>
        <pubDate>Wed, 30 May 2012 14:50:00 +0000</pubDate>
        <enclosure
                sparkle:version="2.1.19"
                url="https://cdn.last.fm/client/Mac/Last.fm-2.1.19.tar.bz2"
                length="28480"
                type="application/octet-stream"
                sparkle:dsaSignature="MC0CFQCnoxk6NB25D6bS7pjvj5zV1qqvFwIULUJgTSO3kIKxdeJz7xV9kV7xT5U="/>
        <description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Media keys on your keyboard now control the radio - play/pause and skip</li>
					<li>More scrobble tab design improvements</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed radio playback issue - some users had trouble skipping between songs</li>
					<ul>
						<li>Updated Phonon library from 4.4 to 4.6</li>
						<li>Switched to VLC as the audio backend</li>
						<li>Note: for users that didn't have this problem, they should notice some general playback performace improvements</li>
						<li>Also note: we made these changes for Windows too - there wasn't this specific bug, but you may still notice a performance improvement</li>
					</ul>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.18</title>
		<pubDate>Thu, 26 Apr 2012 19:20:00 +0000</pubDate>
		<enclosure
				 sparkle:version="2.1.18"
				 url="https://cdn.last.fm/client/Mac/Last.fm-2.1.18.tar.bz2"
				 length="23368"
				 type="application/octet-stream"
				 sparkle:dsaSignature="MCwCFGjp/NirSPRth1LDL77QPCPmkQAyAhQfUM6JKHUD5X2EUJ6wWwdhhXG0fg=="/>
		<sparkle:deltas>
		<enclosure
				 url="https://cdn.last.fm/client/Mac/Last.fm-2.1.18-2.1.16.delta"
				 sparkle:version="2.1.18"
				 sparkle:deltaFrom="2.1.16"
				 length="1688"
				 type="application/octet-stream"
				 sparkle:dsaSignature="MC0CFQCRB1VjXyXaUpOVBsbDx1Rd8Hc68AIUPxqzKj34I8SeOLRiJmzyCPWjWLA="/>
		<enclosure
				 url="https://cdn.last.fm/client/Mac/Last.fm-2.1.18-2.1.17.delta"
				 sparkle:version="2.1.18"
				 sparkle:deltaFrom="2.1.17"
				 length="2064"
				 type="application/octet-stream"
				 sparkle:dsaSignature="MCwCFHOvbrgU7ttfYmhVk40FguibWWWYAhQQ+ezGEWuOPCeV4gVTK5Q3KXZ1Fg=="/>
		</sparkle:deltas>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Scrobble tab design improvements</li>
					<li>Can now delete scrobbles from the list through the right click menu</li>
					<li>Added a licenses dialog for third party software</li>
					<li>About box now has the Last.fm logo</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Quit dialog now asks a question</li>
					<li>Scrobble repeated tracks</li>
					<li>Now restores same size and position when reopening</li>
					<li>Initial window size adjusts for very small/low resolution screens</li>
					<li>Doesn't filter other user's personal stations from your recent stations anymore</li>
					<li>Windows installer now has updated images</li>
					<li>Doesn't need to fetch track info when refreshing the scrobbles list anymore</li>
					<li>Should now run on Mac OSX 10.5.x</li>
				</ul>
		    ]]></description>
	</item>
	<item>
	<title>Last.fm Scrobbler 2.1.17</title>
		<pubDate>Tue, 10 Apr 2012 12:00:00 +0000</pubDate>
		<enclosure
			 sparkle:version="2.1.17" 
			 url="https://cdn.last.fm/client/Mac/Last.fm-2.1.17.tar.bz2" 
			 length="22920" 
			 type="application/octet-stream" 
			 sparkle:dsaSignature="MC0CFFTxxxig47d43vfUk0cazGJneKVEAhUAjhtrQMpb3dCxr2QG+IAQa8UidiY="/>
		<sparkle:deltas>
			<enclosure
				 url="https://cdn.last.fm/client/Mac/Last.fm-2.1.17-2.1.16.delta" 
				 sparkle:version="2.1.17" 
				 sparkle:deltaFrom="2.1.16" 
				 length="936" 
				 type="application/octet-stream" 
				 sparkle:dsaSignature="MCwCFD5bA6NPhtof5kQSbnywYqUK9wvOAhRGkOuC+rDdpl1z5OTJCMTYFbZFtw=="/>
		</sparkle:deltas>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Can now set the language - the app itself isn't translated yet, but this affects artist bios, etc</li>
					<li>Scrobbles list rewritten and improved</li>
					<ul>
						<li>Corrections asterisk with hover over now shown</li>
						<li>Displays if the scrobble is cached and yet to be submitted</li>
						<li>Displays if their was an error when submitting the scrobble - i.e. bad metadata</li>
					</ul>
					<li>Profile, Friends, and Radio tab design improvements</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Always start on the scrobble list when switching to that tab, not the previous track info view</li>
					<li>Less calls made to track.getInfo</li>
					<li>If app is closed to tray and notifications turned off, the only web services called are for scrobbling</li>
				</ul>
		    ]]></description>
</item>
	<item>
		<title>Last.fm Scrobbler 2.1.16</title>
		<pubDate>Thu, 15 Mar 2012 12:20:00 +0000</pubDate>
		<enclosure sparkle:version="2.1.16"
		 url="https://cdn.last.fm/client/Mac/Last.fm-2.1.16.tar.bz2"
		 length="22960"
		 type="application/octet-stream"
		 sparkle:dsaSignature="MC0CFQCEQyJvAbR7S4wVhJaUZ92yqeB40AIUe1N1zKt3QnW6pkbMP8gpKw9HxRk="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Now has a max width of 800px</li>
					<li>Use app icon for all radio stations</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed the now playing display bug</li>
					<li>Fixed a crash that manifested itself in several places (cancelling getting info for a track)</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Beta Version 2.1.15</title>
		<pubDate>Tue, 28 Feb 2012 16:00:00 +0000</pubDate>
		<enclosure sparkle:version="2.1.15"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.1.15.zip"
		           length="59032" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MCwCFHWXu3Odz1EEYnpTRHLZUoc8KKO5AhRqmaZ50QhLxIpATrwkCk1clzQzyw=="/>
		<sparkle:deltas>
			<enclosure url="https://cdn.last.fm/client/Mac/Last.fm-2.1.15-2.1.14.delta"
						sparkle:version="2.1.15"
						sparkle:deltaFrom="2.1.14"
						length="3384"
						type="application/octet-stream"
						sparkle:dsaSignature="MC0CFGEcpucDQFUoe7EQaFM1Z9VgLp2FAhUAgPgQIud6T+CP/XG8igI0MrkdW2c=" />
		</sparkle:deltas>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Radio controls are now in the sys tray too</li>
					<li>Buy links now in the scrobble list view</li>
					<li>There's now a diagnostics dialog - only one tab with the ability to force a check for iPod scrobbles and see the log so far</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Dialogs, like preferences, are now brought to the front if reopened</li>
					<li>Many copy changes around the app</li>
					<li>Doesn't erroneously display two now playing tracks anymore</li>
					<li>iPod scrobbles are submitted immeditaly instead of just cached</li>
					<li>Doesn't fetch track info as much</li>
					<li>The loved state of the current track is now reliable</li>
					<li>Don't ask where Spotify is, if it isn't installed</li>
					<li>Extra dock icons no longer appear</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Beta Version 2.1.14</title>
		<pubDate>Tue, 14 Feb 2012 17:10:00 +0000</pubDate>
		<enclosure sparkle:version="2.1.14"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.1.14.zip"
		           length="58976" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MC0CFQCm/tD1PCjr4Mi1/qvLOG1OoaKNxQIUI+WsnFViB0P9lDF/sMm8KroUSHw="/>
		<description><![CDATA[
				<h3>This is the first public beta version!!!</h3>
				<h3>Bug fixes</h3>
				<ul>
					<li>Updates to the wizard copy</li>
					<li>Buy links now work for uk, us, and de users (was only ever doing uk links)</li>
					<li>Other very minor fixes</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Alpha Version 2.0.13</title>
		<pubDate>Fri, 10 Feb 2012 17:10:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.13"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.0.13.zip"
		           length="59176" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MCwCFHHXLm4vnHA/163VDxm8s4qQssgvAhRbwKVMPS63OImXmO5mMkapIeU8MA=="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Changed the API key. Everyone will have to go through the wizard again</li>
					<li>Now opens lastfm:// radio urls from the web site</li>
					<li>Upgraded to Qt 4.8.0</li>
					<li>Now tells you to close iTunes when there is a new plugin to install</li>
					<li>Message bar now styles nicely</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Doesn't show two now playing tracks in the scrobble list any more</li>
					<li>Fixed quite a few bugs in the frist run wizard</li>
					<li>Fixed some bugs with the account management settings</li>
					<li>Friend list trackpad scrolling is now smooth (Qt 4.8.0)</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.12</title>
		<pubDate>Thu, 02 Feb 2012 17:10:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.12"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.0.12.zip"
		           length="53848" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MCwCFFmYvxQ1+8M06EI1AhtsJDETVrO/AhRTInZ6JAM93MPe6o/UaKIK9uyU3w=="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Now branded as a beta version!</li>
					<li>Tag dialog now implemented to similar standard as the share dialog</li>
					<li>Only fetches track metadata if the window is visable</li>
					<li>Scrobble toggle now in preferences</li>
					<li>'Play' menu option is now not checkable, but has 'play', 'pause' and 'resume' states</li>
					<li>Progress bar now reports the state correctly for podcasts and videos</li>
					<li>Don't display metadata for Spotify ads</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>iTunes plugin now handles device names with ' and \ in them correctly</li>
					<li>Device names are now interpreted as utf-8 by the app</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.11</title>
		<pubDate>Wed, 25 Jan 2012 19:46:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.11"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.0.11.zip"
		           length="54408" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MCwCFDdv1lLNaTRPJTaHIoZLvqI2klD2AhQ+uQJOYHyM9kFsshbkkW0ALtHkOQ=="/>
		<description><![CDATA[
				<h3>Bug fixes 2.0.11</h3>
				<ul>
					<li>Incorrectly thought some radio tracks were podcasts or videos</li>
				</ul>
				<h3>Features - 2.0.10</h3>
				<ul>
					<li>Added option to turn off podcast scrobbling</li>
					<li>Now doesn't scrobble videos from iTunes, that aren't music videos</li>
					<li>Added option to disable desktop notifications</li>
					<li>Added option to disable launching the app with media players</li>
				</ul>
				<h3>Bug fixes 2.0.10</h3>
				<ul>
					<li>Some user setting fixes, you will have to go through the wizard again</li>
					<li>Fixed iTunes plugin crashing iTunes for some Snow Leopard people</li>
					<li>Fixed the menubar not showing sometimes at startup</li>
					<li>If the app is started with --tray option (i.e. from a media player) it now doesn't show the main window</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.10</title>
		<pubDate>Wed, 25 Jan 2012 16:20:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.10"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.0.10.zip"
		           length="54496" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MCwCFEQAxtXPwDtGHruTYrx04PP8FROxAhQwVpzAFN8X297zXXvTyQqn5K6quw=="/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Added option to turn off podcast scrobbling</li>
					<li>Now doesn't scrobble videos from iTunes, that aren't music videos</li>
					<li>Added option to disable desktop notifications</li>
					<li>Added option to disable launching the app with media players</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Some user setting fixes, you will have to go through the wizard again</li>
					<li>Fixed iTunes plugin crashing iTunes for some Snow Leopard people</li>
					<li>Fixed the menubar not showing sometimes at startup</li>
					<li>If the app is started with --tray option (i.e. from a media player) it now doesn't show the main window</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.9</title>
		<pubDate>Mon, 16 Jan 2012 10:20:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.9"
		           url="https://cdn.last.fm/client/Mac/Last.fm-2.0.9.zip"
		           length="52088" 
		           type="application/octet-stream" 
		           sparkle:dsaSignature="MCwCFBtr5ldX6tmaqfn7RL//XLJPZqdWAhQu5HFQXpNtd4QoDatlNBfzOrNASA=="/>
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>iPod scrobble device associations were getting corrupted</li>
					<li>Cleaned up and fixed some bugs in the apps user settings</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.8</title>
		<pubDate>Thu, 12 Jan 2012 10:55:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.8" url="https://cdn.last.fm/client/Mac/Last.fm-2.0.8.zip" length="51896" type="application/octet-stream" sparkle:dsaSignature="MCwCFBuMoqm2G0qlrCyFygeLf6e5e05ZAhQB/hQ067CDeqJsv1LyaDMtRIqU1g=="/>
		<description><![CDATA[
				<h3>Features/Improvements</h3>
				<ul>
					<li>Settings toolbar now looks better and has assets </li>
					<li>Crash Reporting implemented in client, but disabled. (needs oops server set up by ops)</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Stops from iTunes are picked up - end of a playlist, quit iTunes, etc</li>
					<li>Resume iTunes track after playing and pausing radio is now picked up</li>
					<li>Spacebar now works again as a global shortcut</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.7</title>
		<pubDate>Wed, 04 Jan 2012 12:20:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.7" url="https://cdn.last.fm/client/Mac/Last.fm-2.0.7.zip" length="50344" type="application/octet-stream" sparkle:dsaSignature="MCwCFFlKwnxI0WAcCBHYPRp9IvNywXvMAhREH2R5d5IUZK+bULZ3u8XFgwt+dA=="/>
		<description><![CDATA[
		        <ul>
					<li>Fixed a major bug with batch scrobbling</li>
					<li>Fixed a crash for unkown length tracks (iTunes radio streams)</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.6</title>
		<pubDate>Fri, 23 Dec 2011 17:00:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.6" url="https://cdn.last.fm/client/Mac/Last.fm-2.0.6.zip" length="50496" type="application/octet-stream" sparkle:dsaSignature="MC0CFQCGwuA+Sd2RvbtWK3xrjCf3i+eJBgIULgTgtcvxYt3xX3etnF7ZvhXeUwA="/>
		<description><![CDATA[
		        <ul>
					<li>New friends list</li>
					<li>Now installs media player plugins on Windows</li>
					<li>Bootstrapping for all media players now works</li>
					<li>Many other bug fixes and improvements</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.5</title>
		<pubDate>Thu, 17 Nov 2011 16:57:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.5" url="https://cdn.last.fm/client/Mac/Last.fm.2.0.5.zip" length="50368" type="application/octet-stream" sparkle:dsaSignature="MCwCFCi+YjPJ2yvXKXoh/S/Z/B/c8PO7AhRG53S7/K3fMeBChE58OyuPht3oxA=="/>
		<description><![CDATA[
		        <ul>
					<li>Lots of UI changes - welcome screen changed, metadata view improved, etc etc</li>
					<li>Supports updates with libsparkle!</li>
					<li>Uses the Growl framework to show notifications with album art</li>
					<li>Airfoil metadata support</li>
					<li>Scriptable with AppleScript (see the dictionary)</li>
					<li>Campaign tracking when linking to the website</li>
					<li>Radio quick start widget now shows artist and tag suggestions</li>
					<li>Big play buttons now resume the last radio</li>
					<li>Friends list now sorted by most recently listened</li>
					<li>Switching tabs now has a slide animation</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.4</title>
		<pubDate>Tue, 08 Nov 2011 15:30:00 +0000</pubDate>
		<enclosure sparkle:version="2.0.4" url="https://cdn.last.fm/client/Mac/Last.fm.2.0.4.zip" length="50496" type="application/octet-stream" sparkle:dsaSignature="MCwCFB+JR/g7HGKNroRRj7PStc2aH0j4AhR7vlzYCGxVgcdO0pmi7vO2vss0Vg=="/>
		<description><![CDATA[
		        <h3>Embedded release notes!</h3>
		        ...
		    ]]></description>
	</item>
</channel>
</rss>


================================================
FILE: admin/dist/updates/Win/updates.xml
================================================
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Last.fm Scrobbler Updates</title>
	<link>http://cdn.last.fm/client/Win/updates.xml</link>
	<description>Last.fm Scrobbler Updates - Windows</description>
	<language>en</language>
	<item>
		<title>Last.fm Scrobbler 2.1.36</title>
		<pubDate>Tue, 03 Sep 2013 12:14:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.36"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.36.exe"
			 />
		<description><![CDATA[
			<h3>Features</h3>
			<ul>
				<li>New playback controls and progress bar design!</li>
			</ul>
			<h3>Bug fixes</h3>
			<ul>
				<li>iPod scrobbles with multiple plays are now submitted at 1 second intervals instead of all at the same time</li>
				<li>Fingerprinting is fixed and back - it's now also in a different process so fingerprinting problems don't bring down the whole app (just a precaution)</li>
				<li>Fixed some memory leaks</li>
				<li>Scrobble count on profile tab now updated correctly (unless you scrobble elsewhere)</li>
				<li>Do not display corrections in the client (it wasn't respecting the website setting and was causing a few issues)</li>
				<li>'Similar Artist' header in the track metadata view is now a link to more similar artists on the site</li>
				<li>There is now a warning/explanation in the iPod scrobble confirmation dialog when you have red/invalid iPod scrobbles</li>
				<li>Now shows the correct modifier keys on Windows for the raise/hide Scrobbler option</li>
				<li>Mute now works from the system tray and menu option</li>
				<li>The last page of the wizard now doesn't say we've imported your listening history, if we haven't</li>
				<li>Fixed an issue where the tray icon would be invisible if the first run wizard tour was skipped</li>
				<li>Less logging (there was an issue with log file sizes getting very big)</li>
			</ul>
			]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.35</title>
		<pubDate>Wed, 06 Mar 2013 11:29:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.35"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.35.exe"
			 />
		<description><![CDATA[
			<h3>Features</h3>
			<ul>
				<li>Exclude directories! You can now exclude music in certain directories from being scrobbled</li>
				<li>Systray/menu bar icon is greyed out when scrobbling is disabled</li>
				<li>New updating framework - currently just looks better and is smaller, but it's the first step in better Windows updating</li>
				<li>[Experimental] Added the ability to use SSL for all web services calls</li>
			</ul>
			<h3>Bug fixes</h3>
			<ul>
				<li>Fingerprinting was causing crashes so has been temporarily disabled until we find a proper fix</li>
				<li>Device scrobbling improvements</li>
				<ul>
					<li>We now force that a compatible iTunes plugin version is installed before trying to device scrobble</li>
					<li>Prompt to install the new plugin has been improved</li>
					<li>Tracks are now identified by persistent id rather then filename - fixes a few problems and should be more robust</li>
				</ul>
				<li>Windows Media Player scrobbles now include 'album artist' (just like other media players already do)</li>
				<li>Only show 'Open iTunes' if it has been installed</li>
				<li>Settings dialog resizing improved</li>
				<li>Correctly display track metatdata that has characters such as &lt; in it</li>
				<li>The prompt to restart now actually restarts the app</li>
				<li>When installing a plugin from the file menu the full installer is shown - user can select install location, if not default, etc</li>
				<li>Tracks now get their scrobble and loved status updated when the scrobble list is refreshed</li>
				<li>Fixed scrobbling problems associated with setting the scrobble point to 100%</li>
				<ul>
					<li>Fixed double scrobble and missed scrobbles</li>
					<li>There's now a setting to turn of the maximum scrobble point being 4 minutes</li>
					<li>Scrobble point and max scrobble turn off now take effect during the current track</li>
				</ul>
			</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.33</title>
		<pubDate>Thr, 24 Jan 2013 11:00:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.33"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.33.exe"
			 />
		<description><![CDATA[
					<ul>
						<li>First run wizard's continue button no longer gets stuck</li>
						<li>iTunes plugin update for XP scrobbling</li>
					</ul>
					<a class="more" href="http://cdn.last.fm/client/updates/updates.html">Full changelog</a>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.32</title>
		<pubDate>Tue, 22 Jan 2013 13:48:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.32"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.33.exe"
			 />
		<description><![CDATA[
					<h3>Bug fixes</h3>
					<ul>
						<li>All users should now be able to authenticate - changed to a simpler authentication mechanism</li>
						<li>Now runs on Windows XP</li>
						<li>Added a beta updates option - warning: only for the brave!</li>
						<li>Fixed some minor account bootstrap issues</li>
						<li>Open 'media player' links now work on Windows</li>
					</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.30 (First full release!)</title>
		<pubDate>Mon, 14 Jan 2013 16:20:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.30"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.30.exe"
			 />
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Translations updated and complete</li>
					<li>Don't fingerprint files from audio CDs</li>
					<li>Fixed some problems upgrading from The Scrobbler 1.x</li>
					<li>Fixed a crash when enabling/disabling device scrobbling</li>
					<li>Fixed a crash when switching user accounts</li>
					<li>A temporary workaround for a device scrobbling error</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.29</title>
		<pubDate>Mon, 14 Jan 2013 12:00:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.29"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.29.exe"
			 />
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Translations updated and complete</li>
					<li>Don't fingerprint files from audio CDs</li>
					<li>Fixed some problems upgrading from The Scrobbler 1.x</li>
					<li>Fixed a crash when enabling/disabling device scrobbling</li>
					<li>Fixed a crash when switching user accounts</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.28</title>
		<pubDate>Tue, 08 Jan 2013 11:30:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.28"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.28.exe"
			 />
		<description><![CDATA[
				<h3>Changes</h3>
				<ul>
					<li>Side bar images updated slightly</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Restore the main window size and position correctly after restart</li>
					<li>Fixed a crash when fingerprinting some audio files</li>
					<li>Fixed spurious device scrobbles caused by a race condition</li>
					<li>Fixed triple scrobbling when scrobbling offline cached scrobbles</li>
					<li>Don't run the device scrobble checker so often - it was running almost all the time on Windows</li>
					<li>Device scrobble performance improvements</li>
					<li>Minimize and Zoom menu options now work</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.27</title>
		<pubDate>Fri, 21 Dec 2012 15:30:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.27"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.27.exe"
			 />
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed a crash on startup for new users</li>
					<li>Fixed iTunes plays being picked up as device scrobbles Windows (may improve Mac too)</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.26</title>
		<pubDate>Mon, 17 Dec 2012 12:15:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.26"
			 url="http://cdn.last.fm/client/Win/Last.fm-2.1.26.exe"
			 />
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Translations! (almost complete)</li>
					<li>Proxy settings - you can set them from the advanced settings tab and the first step of first run wizard</li>
					<li>iPod scrobbling has been reworked to allow for WiFi sync</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>iPod scrobbling</li>
					<ul>
						<li>iTunes plugin and app now both use the same playcounts db (they didn't before!?)</li>
						<li>Tracks that end within 20 seconds of starting (user skipped to near the end) now get their playcounts synced (was leading to duplicate scrobbles)</li>
						<li>iTunes no longer kept open by us not releasing a handle to it</li>
						<li>Fixed a problem where the iTunes plugin would stop communicating with the app so scrobbling stopped (this also caused the plays to be picked up as iTunes device scrobbles)</li>
						<li>Fixed a problem where the last track of a playlist would not get it's playcount synced leading to it being picked up as an iTunes device scrobble</li>
					</ul>
					<li>Don't divide by zero (crash) for users that are using the app on the same day as they registered</li>
					<li>Fixed restarting the app in Mac, still not working on Windows.</li>
					<li>Radio now goes into the stopped state correctly</li>
					<li>Device scrobble Window is now a child of the main window (it appears positioned on top of it nicely now)</li>
					<li>Fixed a double delete crash when the fingerprinter failed</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.24</title>
		<pubDate>Wed, 26 Sep 2012 11:50:00 +0000</pubDate>
		<enclosure
				 sparkle:os="windows"
				 sparkle:version="2.1.24" 
				 url="http://cdn.last.fm/client/Win/Last.fm-2.1.24.exe"
				 />
		<description><![CDATA[
				<h3>2.1.24</h3>
				<h3>Windows only bug fix release</h3>
				<ul>
					<li>Fixed an issue where iTunes devices (iPod/iPhone) wouldn't scrobble if the app was not installed to the default location</li>
					<li>Fixed a crash with iTunes device scrobbling introduced with the 'album artist' scrobble changes</li>
					<li>Fixed a crash caused by fingerprinting .flac files</li>
					<li>Fixed an issue where the volume would reset to maximum at the start of every radio track</li>
					<li>Fixed a CPU usage issue</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.21</title>
		<pubDate>Tue, 04 Sep 2012 14:20:00 +0000</pubDate>
		<enclosure
				 sparkle:os="windows"
				 sparkle:version="2.1.21" 
				 url="http://cdn.last.fm/client/Win/Last.fm-2.1.21.exe"
				 />
		<description><![CDATA[
				<h3>2.1.21</h3>
				<h3>Features</h3>
				<ul>
					<li>We now scrobble 'album artist' as well as 'artist' for cleaner album pages on the website (all plugins have been updated)</li>
					<li>Fingerprinting local tracks has been added (can be turned off in preferences)</li>
					<li>"Scrobbling is off" message has been added to the status bar</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Better album images in the scrobble list</li>
					<li>We now only ask you to install plugins for apps we've detcted you've installed</li>
					<li>We now make sure you close your media players before plugins are installed</li>
					<li>We now make sure you close WMP or Winamp before bootstrapping (won't bootstrap if they are left open)</li>
					<li>Profile widget now refreshed when you switch to it so data doesn't get as out of date</li>
					<li>Fixed some bugs in the preferences dialog</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.20</title>
			<pubDate>Fri, 01 Jun 2012 16:30:00 +0000</pubDate>
			<enclosure
				 sparkle:os="windows"
				 sparkle:version="2.1.20" 
				 url="http://cdn.last.fm/client/Win/Last.fm-2.1.20.exe"
				 />
			<description><![CDATA[
        		<h3>Bug fixes</h3>
        		<ul>
					<li>Fixed some radio playback issues introduced with the switch to VLC</li>
					<li>Fixed iPod scrobbling (was broken in 2.1.19)</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.19</title>
		<pubDate>Wed, 30 May 2012 14:50:00 +0000</pubDate>
		<enclosure
			 sparkle:os="windows"
			 sparkle:version="2.1.19" 
			 url=""
			 />
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>More scrobble tab design improvements</li>
				</ul>
	    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.18</title>
			<pubDate>Thr, 26 Apr 2012 16:30:00 +0000</pubDate>
			<enclosure
				 sparkle:os="windows"
				 sparkle:version="2.1.18" 
				 url="http://cdn.last.fm/client/Win/Last.fm-2.1.18.exe"
				 />
			<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Scrobble tab design improvements</li>
					<li>Can now delete scrobbles from the list through the right click menu</li>
					<li>Added a licenses dialog for third party software</li>
					<li>About box now has the Last.fm logo</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Quit dialog now asks a question</li>
					<li>Scrobble repeated tracks</li>
					<li>Now restores same size and position when reopening</li>
					<li>Initial window size adjusts for very small/low resolution screens</li>
					<li>Doesn't filter other user's personal stations from your recent stations anymore</li>
					<li>Windows installer now has updated images</li>
					<li>Doesn't need to fetch track info when refreshing the scrobbles list anymore</li>
					<li>Should now run on Mac OSX 10.5.x</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.17</title>
			<pubDate>Mon, 14 Mar 2012 18:30:00 +0000</pubDate>
			<enclosure
				 sparkle:os="windows"
				 sparkle:version="2.1.17" 
				 url="http://cdn.last.fm/client/Win/Last.fm-2.1.17.exe"
				 />
			<description><![CDATA[
					<h3>Features</h3>
					<ul>
						<li>Can now set the language - the app itself isn't translated yet, but this affects artist bios, etc</li>
						<li>Scrobbles list rewritten and improved</li>
						<ul>
							<li>Corrections asterisk with hover over now shown</li>
							<li>Displays if the scrobble is cached and yet to be submitted</li>
							<li>Displays if their was an error when submitting the scrobble - i.e. bad metadata</li>
						</ul>
						<li>Profile, Friends, and Radio tab design improvements</li>
					</ul>
					<h3>Bug fixes</h3>
					<ul>
						<li>Always start on the scrobble list when switching to that tab, not the previous track info view</li>
						<li>Less calls made to track.getInfo</li>
						<li>If app is closed to tray and notifications turned off, the only web services called are for scrobbling</li>
					</ul>
				]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.16</title>
		<pubDate>Thr, 15 Mar 2012 11:10:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.1.16"
			url="http://cdn.last.fm/client/Win/Last.fm-2.1.16.exe"
			/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Now has a max width of 800px</li>
					<li>Use app icon for all radio stations</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed the now playing display bug</li>
					<li>Fixed a crash that manifested itself in several places (cancelling getting info for a track)</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Beta Version 2.1.15</title>
		<pubDate>Tue, 28 Feb 2012 16:00:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.1.15"
			url="http://static.last.fm/client/Win/Last.fm-2.1.15.exe"
			/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Radio controls are now in the sys tray too</li>
					<li>Buy links now in the scrobble list view</li>
					<li>There's now a diagnostics dialog - only one tab with the ability to force a check for iPod scrobbles and see the log so far</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Dialogs, like preferences, are now brought to the front if reopened</li>
					<li>Many copy changes around the app</li>
					<li>Doesn't erroneously display two now playing tracks anymore</li>
					<li>iPod scrobbles are submitted immeditaly instead of just cached</li>
					<li>Doesn't fetch track info as much</li>
					<li>The loved state of the current track is now reliable</li>
					<li>iPod scrobbling should now work</li>
					<li>'Close' and 'Apply' buttons now work correctly</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Beta Version 2.1.14</title>
		<pubDate>Tue, 14 Feb 2012 13:30:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.1.14"
			url="http://static.last.fm/client/Win/Last.fm-2.1.14.exe"
			/>
		<description><![CDATA[
				<h3>This is the first public beta version</h3>
					<h3>Bug fixes</h3>
				<ul>
					<li>Updates to the wizard copy</li>
					<li>Buy links now work for uk, us, and de users (was only ever doing uk links)</li>
					<li>Other very minor fixes</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Alpha Version 2.0.13</title>
		<pubDate>Fri, 10 Feb 2012 18:50:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.13"
			url="http://static.last.fm/client/Win/Last.fm-2.0.13.exe"
			/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Changed the API key. Everyone will have to go through the wizard again</li>
					<li>Message bar now styles nicely</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Doesn't show two now playing tracks in the scrobble list any more</li>
					<li>Fixed quite a few bugs in the frist run wizard</li>
					<li>Fixed some bugs with the account management settings</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.12</title>
		<pubDate>Thr, 02 Feb 2012 18:20:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.12"
			url="http://static.last.fm/client/Win/Last.fm-2.0.12.exe"
			/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Now branded as a beta version!</li>
					<li>Tag dialog now implemented to similar standard as the share dialog</li>
					<li>Only fetches track metadata if the window is visable</li>
					<li>Scrobble toggle now in preferences</li>
					<li>'Play' menu option is now not checkable, but has 'play', 'pause' and 'resume' states</li>
					<li>Progress bar now reports the state correctly for podcasts and videos</li>
					<li>Don't display metadata for Spotify ads</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>iPod scrobbling should now work (as well as it does on mac)! The installer was incorrect</li>
					<li>iTunes plugin now handles device names with ' and \ in them correctly</li>
					<li>Device names are now interpreted as utf-8 by the app</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.11</title>
		<pubDate>Wed, 25 Jan 2012 20:10:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.11"
			url="http://static.last.fm/client/Win/Last.fm-2.0.11.exe"
			/>
		<description><![CDATA[
				<h3>Bug fixes 2.0.11</h3>
				<ul>
					<li>Incorrectly though some radio tracks were podcasts or videos</li>
				</ul>
				<h3>Features - 2.0.10</h3>
				<ul>
					<li>Added option to turn off podcast scrobbling</li>
					<li>Now doesn't scrobble videos from iTunes, that aren't music videos</li>
					<li>Added option to disable desktop notifications</li>
					<li>Added option to disable launching the app with media players</li>
				</ul>
				<h3>Bug fixes 2.0.10</h3>
				<ul>
					<li>Some user setting fixes, you will have to go through the wizard again</li>
					<li>Fixes to iTunes plugin communication problems (named pipe type incompatibilities)</li>
					<li>If the app is started with --tray option (i.e. from a media player) it now doesn't show the main window</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.10</title>
		<pubDate>Wed, 25 Jan 2012 17:30:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.10"
			url="http://static.last.fm/client/Win/Last.fm-2.0.10.exe"
			/>
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Added option to turn off podcast scrobbling</li>
					<li>Now doesn't scrobble videos from iTunes, that aren't music videos</li>
					<li>Added option to disable desktop notifications</li>
					<li>Added option to disable launching the app with media players</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Some user setting fixes, you will have to go through the wizard again</li>
					<li>Fixes to iTunes plugin communication problems (named pipe type incompatibilities)</li>
					<li>If the app is started with --tray option (i.e. from a media player) it now doesn't show the main window</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.9</title>
		<pubDate>Mon, 16 Jan 2012 11:20:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.9"
			url="http://static.last.fm/client/Win/Last.fm-2.0.9.exe"
			/>
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>New iTunes plugin was not working due to a change in Qt</li>
					<li>iPod scrobble device associations were getting corrupted</li>
					<li>Cleaned up and fixed some bugs in the apps user settings</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.8</title>
		<pubDate>Thu, 12 Jan 2012 11:45:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.8"
			url="http://static.last.fm/client/Win/Last.fm-2.0.8.exe"
			/>
		<description><![CDATA[
		<h3>Features/Improvements</h3>
		<ul>
			<li>Settings toolbar now looks better and has assets </li>
			<li>Crash Reporting implemented in client, but disabled. (needs oops server set up by ops)</li>
		</ul>
		<h3>Bug fixes</h3>
		<ul>
			<li>Spacebar now works again as a global shortcut</li>
		</ul>
	]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.7</title>
		<pubDate>Wed, 04 Jan 2012 12:45:00 +0000</pubDate>
		<enclosure
			sparkle:version="2.0.7"
			url="http://static.last.fm/client/Win/Last.fm-2.0.7.exe"
			sparkle:os="windows"/>
		<description><![CDATA[
			<ul>
				<li>Fixed a major bug with batch scrobbling</li>
				<li>Fixed a crash for unkown length tracks (iTunes radio streams)</li>
			</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.6</title>
		<pubDate>Fri, 23 Dec 2011 17:00:00 +0000</pubDate>
		<enclosure
			sparkle:os="windows"
			sparkle:version="2.0.6"
			url="http://static.last.fm/client/Win/Last.fm-2.0.6.exe"
			/>
	</item>
	<item>
		<title>Last.fm Scrobbler Version 2.0.1</title>
		<pubDate>Wed, 02 Nov 2011 11:11:11 +0000</pubDate>
		<enclosure sparkle:version="2.0.1"
			url="http://cdn.last.fm/20111102WIN.exe"
			sparkle:os="windows"/>
	</item>
</channel>
</rss>


================================================
FILE: admin/dist/updates/updates.html
================================================
<html>
  <head>
    <title>Last.fm Scrobbler Changelog</title>
    <style type="text/css">

      html {
        background: #f2f2f2;
      }

      body {
        margin: 0;
        padding: 0;
        font-family: "Lucida Grande", "Helvetica Neue", Arial, sans-serif;
        line-height: 18px;
        color: #333;
      }

      h1, h2, h3 {
        font-size: 18px;
        color: #333;
        line-height: 24px;
      }

      .branding {
        background: -webkit-linear-gradient(#e31d2a, #bf0623);
        background:    -moz-linear-gradient(#e31d2a, #bf0623);
        background:       -o-liear-gradient(#e31d2a, #bf0623);
        background:         linear-gradient(#e31d2a, #bf0623);
        border-bottom: 1px solid #9f081e;
        height: 60px;
        box-shadow: rgba(0,0,0,0.3) 0 1px 1px;
        width: 100%;
        text-align: center;
        position: relative;
      }

      .logo {
        display: inline-block;
        width: 100px;
        height: 35px;
        margin-top: 18px;
        text-indent: -9999px;
        background: url('../images/lastfm.png') no-repeat;    
      }

      .options {
        margin: 20px 0px 0px;
      }

      .platforms,
      .releasestates {
        margin-left: 30px;
      }

      article {
        border-top: 1px solid #ccc;
        text-shadow: #fff 0 1px 0;
        min-height: 100%;
        max-width: 940px;
        margin: 0 auto;
        position: relative;
      }

      .update {
        padding: 10px;
      }

      .title {
        padding: 0px 20px 0px;
      }

      a {
        color: inherit; 
      }

      a:hover {
        text-decoration: none;
      }

      .description {
        border: solid 1px #ddd;
        padding: 0px 20px 0px;
      }

      .more {
        visibility: hidden;
      }

    </style>
    <script type="text/javascript">

      var BrowserDetect = {
        init: function () {
          this.OS = this.searchString(this.dataOS) || "an unknown OS";
        },
        searchString: function (data) {
          for (var i=0;i<data.length;i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
              if (dataString.indexOf(data[i].subString) != -1)
                return data[i].identity;
            }
            else if (dataProp)
              return data[i].identity;
          }
        },
        dataOS : [
          {
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
          },
          {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
          },
          {
               string: navigator.userAgent,
               subString: "iPhone",
               identity: "iPhone/iPod"
            },
          {
            string: navigator.platform,
            subString: "Linux",
            identity: "Linux"
          }
        ]

      };
      BrowserDetect.init();

      function getParameterByName(name)
      {
        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.search);
        if(results == null || results=="")
          return null;
        else
          return decodeURIComponent(results[1].replace(/\+/g, " "));
      }

      function onload_cb()
      {
        // format the update descriptions properly
        var divElements = document.getElementsByTagName('div');
        for (var i = 0; i < divElements.length; i++)
        {
          var el = divElements[i];
          if (el.className == 'description') {
            el.innerHTML = el.firstChild ? el.firstChild.textContent : "";
          }
        }

        var platform = getParameterByName("platform");
        var releasestate = getParameterByName("releasestate");

        // pass on the query parameters to the relevant links
        var aElements = document.getElementsByTagName('a');
        for (var i = 0; i < aElements.length; i++)
        {
          var el = aElements[i];
          if (el.className == "releasestate" && platform) {
            el.setAttribute( "href", el.getAttribute("href") + "&platform=" + platform );
          } else if (el.className == "platform" && releasestate) {
            el.setAttribute( "href", el.getAttribute("href") + "&releasestate=" + releasestate );
          }
        }
      }

      function loadXMLDoc(dname)
      {
        if (window.XMLHttpRequest) 
        {
          xhttp=new XMLHttpRequest();
        }
        else
        {
          xhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xhttp.open("GET",dname,false);
        xhttp.send("");
        return xhttp.responseXML;
      }

      function displayResult()
      {
        OS = getParameterByName("platform") || BrowserDetect.OS;

        if ( OS == "Mac" ) {
          xml=loadXMLDoc( getParameterByName("releasestate") == "beta" ? "updates.mac.beta.xml" : "updates.mac.xml");
          document.getElementById("mac").style.fontWeight="bold";
        } else if ( OS == "Linux" ) {
          xml=loadXMLDoc("updates.linux.xml");
          document.getElementById("linux").style.fontWeight="bold";
        } else {
          xml=loadXMLDoc( getParameterByName("releasestate") == "beta" ? "updates.win.beta.xml" : "updates.win.xml");
          document.getElementById("win").style.fontWeight="bold";
        }

        if ( getParameterByName("releasestate") == "beta" ) {
          document.getElementById("beta").style.fontWeight="bold";
        } else {
          document.getElementById("production").style.fontWeight="bold";
        }

        xsl=loadXMLDoc("updates.xsl");
        // code for IE
        if (window.ActiveXObject)
        {
          ex=xml.transformNode(xsl);
          document.getElementById("wrapper").innerHTML=ex;
        }
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation && document.implementation.createDocument)
        {
          xsltProcessor=new XSLTProcessor();
          xsltProcessor.importStylesheet(xsl);
          resultDocument = xsltProcessor.transformToFragment(xml,document);
          document.getElementById("wrapper").appendChild(resultDocument);
        }
      }

    </script>
  </head>
  <body onload="displayResult(); onload_cb();">
    <header>
      <div class="branding">
        <a href="http://www.last.fm">
          <div class="logo">Last.fm</div>
        </a>
      </div>
    </header>
    <article>
      <div class="options">
        <span class="platforms">Platform: <a class="platform" id="win" href="updates.html?platform=Win">Windows</a> <a class="platform" id="mac" href="updates.html?platform=Mac">Mac</a> <a class="platform" id="linux" href="updates.html?platform=Linux">Linux</a></span>
        <span class="releasestates">Release state: <a class="releasestate" id="production" href="updates.html?releasestate=production">Production</a> <a class="releasestate" id="beta" href="updates.html?releasestate=beta">Beta</a></span>
      </div>
      <div id="wrapper"></div>
    </article>
  </body>
</html>

================================================
FILE: admin/dist/updates/updates.linux.xml
================================================
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Last.fm Scrobbler Updates</title>
	<link>http://cdn.last.fm/client/updates/updates.lin.xml</link>
	<description>Last.fm Scrobbler Updates - Linux</description>
	<language>en</language>
	<item>
		<title>Last.fm Scrobbler 2.1.33</title>
		<pubDate>Thr, 24 Jan 2013 11:00:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
					<ul>
						<li>First run wizard's continue button no longer gets stuck</li>
					</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.32</title>
		<pubDate>Tue, 22 Jan 2013 13:48:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
					<h3>Bug fixes</h3>
					<ul>
						<li>All users should now be able to authenticate - changed to a simpler authentication mechanism</li>
						<li>Added a beta updates option - warning: only for the brave!</li>
						<li>Fixed some minor account bootstrap issues</li>
					</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.30</title>
		<pubDate>Mon, 14 Jan 2013 16:20:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Translations updated and complete</li>
					<li>Don't fingerprint files from audio CDs</li>
					<li>Fixed some problems upgrading from The Scrobbler 1.x</li>
					<li>Fixed a crash when enabling/disabling device scrobbling</li>
					<li>Fixed a crash when switching user accounts</li>
					<li>A temporary workaround for a device scrobbling error</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.29</title>
		<pubDate>Mon, 14 Jan 2013 12:00:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Translations updated and complete</li>
					<li>Don't fingerprint files from audio CDs</li>
					<li>Fixed some problems upgrading from The Scrobbler 1.x</li>
					<li>Fixed a crash when enabling/disabling device scrobbling</li>
					<li>Fixed a crash when switching user accounts</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.28</title>
		<pubDate>Tue, 08 Jan 2013 11:30:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Changes</h3>
				<ul>
					<li>Side bar images updated slightly</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Restore the main window size and position correctly after restart</li>
					<li>Fixed spurious device scrobbles caused by a race condition</li>
					<li>Fixed triple scrobbling when scrobbling offline cached scrobbles</li>
					<li>Don't run the device scrobble checker so often - it was running almost all the time on Windows</li>
					<li>Device scrobble performance improvements</li>
					<li>Minimize and Zoom menu options now work</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.27</title>
		<pubDate>Fri, 21 Dec 2012 15:30:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed a crash on startup for new users</li>
					<li>Fixed iTunes plays being picked up as device scrobbles Windows (may improve Mac too)</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.26</title>
		<pubDate>Mon, 17 Dec 2012 12:15:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Translations! (almost complete)</li>
					<li>Proxy settings - you can set them from the advanced settings tab and the first step of first run wizard</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Don't divide by zero (crash) for users that are using the app on the same day as they registered</li>
					<li>Fixed restarting the app in Mac, still not working on Windows.</li>
					<li>Radio now goes into the stopped state correctly</li>
					<li>Device scrobble Window is now a child of the main window (it appears positioned on top of it nicely now)</li>
					<li>Fixed a double delete crash when the fingerprinter failed</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.24</title>
		<pubDate>Wed, 26 Sep 2012 11:50:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Windows only bug fix release</h3>
				<ul>
					<li>Fixed an issue where iTunes devices (iPod/iPhone) wouldn't scrobble if the app was not installed to the default location</li>
					<li>Fixed a crash with iTunes device scrobbling introduced with the 'album artist' scrobble changes</li>
					<li>Fixed a crash caused by fingerprinting .flac files</li>
					<li>Fixed an issue where the volume would reset to maximum at the start of every radio track</li>
					<li>Fixed a CPU usage issue</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.21</title>
		<pubDate>Tue, 04 Sep 2012 14:20:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>We now scrobble 'album artist' as well as 'artist' for cleaner album pages on the website (all plugins have been updated)</li>
					<li>Fingerprinting local tracks has been added (can be turned off in preferences)</li>
					<li>"Scrobbling is off" message has been added to the status bar</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Better album images in the scrobble list</li>
					<li>We now only ask you to install plugins for apps we've detcted you've installed</li>
					<li>We now make sure you close your media players before plugins are installed</li>
					<li>We now make sure you close WMP or Winamp before bootstrapping (won't bootstrap if they are left open)</li>
					<li>Profile widget now refreshed when you switch to it so data doesn't get as out of date</li>
					<li>Fixed some bugs in the preferences dialog</li>
				</ul>
		]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.20</title>
		<pubDate>Fri, 01 Jun 2012 16:30:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
    		<h3>Bug fixes</h3>
    		<ul>
				<li>Fixed some radio playback issues introduced with the switch to VLC</li>
			</ul>
	    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.19</title>
		<pubDate>Wed, 30 May 2012 14:50:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
			<h3>Features</h3>
			<ul>
				<li>[Mac] Media keys on your keyboard now control the radio - play/pause and skip</li>
				<li>More scrobble tab design improvements</li>
			</ul>
			<h3>Bug fixes</h3>
			<ul>
				<li>[Mac] Fixed radio playback issue - some users had trouble skipping between songs</li>
				<ul>
					<li>Updated Phonon library from 4.4 to 4.6</li>
					<li>Switched to VLC as the audio backend</li>
					<li>Note: for users that didn't have this problem, they should notice some general playback performace improvements</li>
					<li>Also note: we made these changes for Windows too - there wasn't this specific bug, but you may still notice a performance improvement</li>
				</ul>
			</ul>
	    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.18</title>
			<pubDate>Thr, 26 Apr 2012 16:30:00 +0000</pubDate>
			<enclosure url="http://apt.last.fm" />
			<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Scrobble tab design improvements</li>
					<li>Can now delete scrobbles from the list through the right click menu</li>
					<li>Added a licenses dialog for third party software</li>
					<li>About box now has the Last.fm logo</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Quit dialog now asks a question</li>
					<li>Scrobble repeated tracks</li>
					<li>Now restores same size and position when reopening</li>
					<li>Initial window size adjusts for very small/low resolution screens</li>
					<li>Doesn't filter other user's personal stations from your recent stations anymore</li>
					<li>Windows installer now has updated images</li>
					<li>Doesn't need to fetch track info when refreshing the scrobbles list anymore</li>
					<li>Should now run on Mac OSX 10.5.x</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.17</title>
			<pubDate>Mon, 14 Mar 2012 18:30:00 +0000</pubDate>
			<enclosure url="http://apt.last.fm" />
			<description><![CDATA[
					<h3>Features</h3>
					<ul>
						<li>Can now set the language - the app itself isn't translated yet, but this affects artist bios, etc</li>
						<li>Scrobbles list rewritten and improved</li>
						<ul>
							<li>Corrections asterisk with hover over now shown</li>
							<li>Displays if the scrobble is cached and yet to be submitted</li>
							<li>Displays if their was an error when submitting the scrobble - i.e. bad metadata</li>
						</ul>
						<li>Profile, Friends, and Radio tab design improvements</li>
					</ul>
					<h3>Bug fixes</h3>
					<ul>
						<li>Always start on the scrobble list when switching to that tab, not the previous track info view</li>
						<li>Less calls made to track.getInfo</li>
						<li>If app is closed to tray and notifications turned off, the only web services called are for scrobbling</li>
					</ul>
				]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler 2.1.16</title>
		<pubDate>Thr, 15 Mar 2012 11:10:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Now has a max width of 800px</li>
					<li>Use app icon for all radio stations</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Fixed the now playing display bug</li>
					<li>Fixed a crash that manifested itself in several places (cancelling getting info for a track)</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Beta Version 2.1.15</title>
		<pubDate>Tue, 28 Feb 2012 16:00:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>Features</h3>
				<ul>
					<li>Radio controls are now in the sys tray too</li>
					<li>Buy links now in the scrobble list view</li>
					<li>There's now a diagnostics dialog - only one tab with the ability to force a check for iPod scrobbles and see the log so far</li>
				</ul>
				<h3>Bug fixes</h3>
				<ul>
					<li>Dialogs, like preferences, are now brought to the front if reopened</li>
					<li>Many copy changes around the app</li>
					<li>Doesn't erroneously display two now playing tracks anymore</li>
					<li>iPod scrobbles are submitted immeditaly instead of just cached</li>
					<li>Doesn't fetch track info as much</li>
					<li>The loved state of the current track is now reliable</li>
					<li>[Win] iPod scrobbling should now work</li>
					<li>[Win] 'Close' and 'Apply' buttons now work correctly</li>
					<li>[Mac] Don't ask where Spotify is, if it isn't installed</li>
					<li>[Mac] Extra dock icons no longer appear</li>
				</ul>
		    ]]></description>
	</item>
	<item>
		<title>Last.fm Scrobbler Beta Version 2.1.14</title>
		<pubDate>Tue, 14 Feb 2012 13:30:00 +0000</pubDate>
		<enclosure url="http://apt.last.fm" />
		<description><![CDATA[
				<h3>This is the first public beta version</h3>
					<h3>Bug fixes</h3>
				<ul>
			
Download .txt
gitextract_3180lsex/

├── .gitignore
├── .gitmodules
├── COPYING
├── Last.fm.pro
├── README.md
├── admin/
│   ├── Doxyfile
│   ├── dist/
│   │   ├── mac/
│   │   │   ├── AppleScriptSuite.sdef
│   │   │   ├── Growl Registration Ticket.growlRegDict
│   │   │   ├── Standard.plist
│   │   │   ├── build-release.rb
│   │   │   ├── bundleFrameworks.sh
│   │   │   ├── dacp.fm.last.Scrobbler.scpt
│   │   │   ├── dsa_pub.pem
│   │   │   ├── fm.last.Scrobbler.scpt
│   │   │   └── sign_update.rb
│   │   ├── updates/
│   │   │   ├── Changelog.txt
│   │   │   ├── Mac/
│   │   │   │   └── updates.xml
│   │   │   ├── Win/
│   │   │   │   └── updates.xml
│   │   │   ├── updates.html
│   │   │   ├── updates.linux.xml
│   │   │   ├── updates.mac.beta.xml
│   │   │   ├── updates.mac.xml
│   │   │   ├── updates.win.beta.xml
│   │   │   └── updates.win.xml
│   │   └── win/
│   │       ├── Last.fm.iss
│   │       ├── build-release-win.pl
│   │       ├── isspp
│   │       └── wix/
│   │           ├── boffin.wxs
│   │           ├── client.wxs
│   │           ├── eula.rtf
│   │           ├── qt.conf
│   │           ├── wixboff.cmd
│   │           └── wixclient.cmd
│   ├── include.qmake
│   ├── qmake/
│   │   ├── 1stparty.pro.inc
│   │   ├── 3rdparty.pro.inc
│   │   ├── QtOverride.pro.inc
│   │   └── debug.pro.inc
│   └── tests/
│       ├── QtTest_to_JUnit.xslt
│       ├── log_test.sh
│       └── run_tests.sh
├── app/
│   ├── boffin/
│   │   ├── App.cpp
│   │   ├── App.h
│   │   ├── HistoryWidget.cpp
│   │   ├── HistoryWidget.h
│   │   ├── Info.plist.in
│   │   ├── LocalCollectionScanner.cpp
│   │   ├── LocalCollectionScanner.h
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── MediaPipeline.cpp
│   │   ├── MediaPipeline.h
│   │   ├── PickDirsDialog.cpp
│   │   ├── PickDirsDialog.h
│   │   ├── PlaydarHostsModel.cpp
│   │   ├── PlaydarHostsModel.h
│   │   ├── PlaydarTagCloudModel.cpp
│   │   ├── PlaydarTagCloudModel.h
│   │   ├── Playlist.cpp
│   │   ├── Playlist.h
│   │   ├── PlaylistModel.cpp
│   │   ├── PlaylistModel.h
│   │   ├── PlaylistWidget.h
│   │   ├── ScanProgressWidget.cpp
│   │   ├── ScanProgressWidget.h
│   │   ├── ScrobSocket.cpp
│   │   ├── ScrobSocket.h
│   │   ├── Shuffler.cpp
│   │   ├── Shuffler.h
│   │   ├── TagBrowserWidget.cpp
│   │   ├── TagBrowserWidget.h
│   │   ├── TagCloudView.cpp
│   │   ├── TagCloudView.h
│   │   ├── TagDelegate.cpp
│   │   ├── TagDelegate.h
│   │   ├── TrackSource.cpp
│   │   ├── TrackSource.h
│   │   ├── WordleDialog.h
│   │   ├── XspfDialog.cpp
│   │   ├── XspfDialog.h
│   │   ├── XspfReader.cpp
│   │   ├── XspfReader.h
│   │   ├── boffin.pro
│   │   ├── comet/
│   │   │   ├── CometParser.cpp
│   │   │   ├── CometParser.h
│   │   │   └── YajlCallbacks.hpp
│   │   ├── json_spirit/
│   │   │   ├── README
│   │   │   ├── json_spirit.h
│   │   │   ├── json_spirit_reader.cpp
│   │   │   ├── json_spirit_reader.h
│   │   │   ├── json_spirit_utils.h
│   │   │   ├── json_spirit_value.cpp
│   │   │   ├── json_spirit_value.h
│   │   │   ├── json_spirit_writer.cpp
│   │   │   └── json_spirit_writer.h
│   │   ├── layouts/
│   │   │   ├── SideBySideLayout.cpp
│   │   │   └── SideBySideLayout.h
│   │   ├── main.cpp
│   │   ├── playdar/
│   │   │   ├── BoffinPlayableItem.cpp
│   │   │   ├── BoffinPlayableItem.h
│   │   │   ├── BoffinRqlRequest.cpp
│   │   │   ├── BoffinRqlRequest.h
│   │   │   ├── BoffinTagRequest.cpp
│   │   │   ├── BoffinTagRequest.h
│   │   │   ├── CometRequest.cpp
│   │   │   ├── CometRequest.h
│   │   │   ├── PlaydarApi.h
│   │   │   ├── PlaydarAuthRequest.cpp
│   │   │   ├── PlaydarAuthRequest.h
│   │   │   ├── PlaydarCometRequest.cpp
│   │   │   ├── PlaydarCometRequest.h
│   │   │   ├── PlaydarConnection.cpp
│   │   │   ├── PlaydarConnection.h
│   │   │   ├── PlaydarRosterRequest.cpp
│   │   │   ├── PlaydarRosterRequest.h
│   │   │   ├── PlaydarStatRequest.cpp
│   │   │   ├── PlaydarStatRequest.h
│   │   │   ├── TPlaydarApi.hpp
│   │   │   ├── TrackResolveRequest.cpp
│   │   │   ├── TrackResolveRequest.h
│   │   │   ├── jsonGetMember.cpp
│   │   │   └── jsonGetMember.h
│   │   ├── qrc/
│   │   │   └── boffin.qrc
│   │   └── sample/
│   │       └── SampleFromDistribution.h
│   ├── client/
│   │   ├── Application.cpp
│   │   ├── Application.h
│   │   ├── AudioscrobblerSettings.cpp
│   │   ├── AudioscrobblerSettings.h
│   │   ├── Bootstrapper/
│   │   │   ├── AbstractBootstrapper.cpp
│   │   │   ├── AbstractBootstrapper.h
│   │   │   ├── AbstractFileBootstrapper.cpp
│   │   │   ├── AbstractFileBootstrapper.h
│   │   │   ├── ITunesDevice/
│   │   │   │   ├── ITunesParser.h
│   │   │   │   ├── MediaDeviceInterface.h
│   │   │   │   ├── itunesdevice.cpp
│   │   │   │   └── itunesdevice.h
│   │   │   ├── PluginBootstrapper.cpp
│   │   │   ├── PluginBootstrapper.h
│   │   │   ├── iTunesBootstrapper.cpp
│   │   │   └── iTunesBootstrapper.h
│   │   ├── CommandReciever/
│   │   │   ├── CommandReciever.h
│   │   │   └── CommandReciever.mm
│   │   ├── Dialogs/
│   │   │   ├── BetaDialog.cpp
│   │   │   ├── BetaDialog.h
│   │   │   ├── BetaDialog.ui
│   │   │   ├── DiagnosticsDialog.cpp
│   │   │   ├── DiagnosticsDialog.h
│   │   │   ├── DiagnosticsDialog.ui
│   │   │   ├── LicensesDialog.cpp
│   │   │   ├── LicensesDialog.h
│   │   │   └── LicensesDialog.ui
│   │   ├── Fingerprinter/
│   │   │   ├── AacSource.cpp
│   │   │   ├── AacSource.h
│   │   │   ├── AacSource_p.h
│   │   │   ├── FlacSource.cpp
│   │   │   ├── FlacSource.h
│   │   │   ├── MadSource.cpp
│   │   │   ├── MadSource.h
│   │   │   ├── VorbisSource.cpp
│   │   │   └── VorbisSource.h
│   │   ├── Last.fm Scrobbler.css
│   │   ├── MainWindow.cpp
│   │   ├── MainWindow.h
│   │   ├── MediaDevices/
│   │   │   ├── DeviceScrobbler.cpp
│   │   │   ├── DeviceScrobbler.h
│   │   │   ├── IpodDevice.cpp
│   │   │   ├── IpodDevice.h
│   │   │   ├── IpodDevice_linux.cpp
│   │   │   ├── IpodDevice_linux.h
│   │   │   ├── MediaDevice.cpp
│   │   │   └── MediaDevice.h
│   │   ├── Mpris2/
│   │   │   ├── DBusAbstractAdaptor.cpp
│   │   │   ├── DBusAbstractAdaptor.h
│   │   │   ├── MediaPlayer2.cpp
│   │   │   ├── MediaPlayer2.h
│   │   │   ├── MediaPlayer2Player.cpp
│   │   │   ├── MediaPlayer2Player.h
│   │   │   ├── Mpris2.cpp
│   │   │   └── Mpris2.h
│   │   ├── PrefPane/
│   │   │   ├── English.lproj/
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   └── MainWindow.xib
│   │   │   ├── FmLastPrefPane.h
│   │   │   ├── FmLastPrefPanePrefWidget.h
│   │   │   ├── FmLastPrefPanePrefWidget.mm
│   │   │   ├── FmLastPrefPaneQtView.h
│   │   │   ├── FmLastPrefPaneQtView.mm
│   │   │   ├── Info.plist
│   │   │   ├── PrefPane.pro
│   │   │   ├── PrefPane.xcodeproj/
│   │   │   │   └── project.pbxproj
│   │   │   └── PrefPane_prefix.pch
│   │   ├── ScrobSocket.cpp
│   │   ├── ScrobSocket.h
│   │   ├── Services/
│   │   │   ├── AnalyticsService/
│   │   │   │   ├── AnalyticsService.cpp
│   │   │   │   ├── AnalyticsService.h
│   │   │   │   ├── PersistentCookieJar.cpp
│   │   │   │   └── PersistentCookieJar.h
│   │   │   ├── AnalyticsService.h
│   │   │   ├── RadioService/
│   │   │   │   └── RadioService.cpp
│   │   │   ├── ScrobbleService/
│   │   │   │   ├── ScrobbleService.cpp
│   │   │   │   ├── ScrobbleService.h
│   │   │   │   ├── StopWatch.cpp
│   │   │   │   └── StopWatch.h
│   │   │   └── ScrobbleService.h
│   │   ├── Settings/
│   │   │   ├── AccountSettingsWidget.cpp
│   │   │   ├── AccountSettingsWidget.h
│   │   │   ├── AccountSettingsWidget.ui
│   │   │   ├── AdvancedSettingsWidget.cpp
│   │   │   ├── AdvancedSettingsWidget.h
│   │   │   ├── AdvancedSettingsWidget.ui
│   │   │   ├── CheckFileSystemModel.cpp
│   │   │   ├── CheckFileSystemModel.h
│   │   │   ├── CheckFileSystemView.cpp
│   │   │   ├── CheckFileSystemView.h
│   │   │   ├── GeneralSettingsWidget.cpp
│   │   │   ├── GeneralSettingsWidget.h
│   │   │   ├── GeneralSettingsWidget.ui
│   │   │   ├── IpodSettingsWidget.cpp
│   │   │   ├── IpodSettingsWidget.h
│   │   │   ├── IpodSettingsWidget.ui
│   │   │   ├── PreferencesDialog.cpp
│   │   │   ├── PreferencesDialog.h
│   │   │   ├── PreferencesDialog.ui
│   │   │   ├── ScrobbleSettingsWidget.cpp
│   │   │   ├── ScrobbleSettingsWidget.h
│   │   │   ├── ScrobbleSettingsWidget.ui
│   │   │   ├── SettingsWidget.cpp
│   │   │   └── SettingsWidget.h
│   │   ├── Widgets/
│   │   │   ├── BioWidget.cpp
│   │   │   ├── BioWidget.h
│   │   │   ├── ContextLabel.cpp
│   │   │   ├── ContextLabel.h
│   │   │   ├── FriendListWidget.cpp
│   │   │   ├── FriendListWidget.h
│   │   │   ├── FriendListWidget.ui
│   │   │   ├── FriendWidget.cpp
│   │   │   ├── FriendWidget.h
│   │   │   ├── FriendWidget.ui
│   │   │   ├── MetadataWidget.cpp
│   │   │   ├── MetadataWidget.h
│   │   │   ├── MetadataWidget.ui
│   │   │   ├── NothingPlayingWidget.cpp
│   │   │   ├── NothingPlayingWidget.h
│   │   │   ├── NothingPlayingWidget.ui
│   │   │   ├── NothingPlayingWidget_mac.mm
│   │   │   ├── NowPlayingStackedWidget.cpp
│   │   │   ├── NowPlayingStackedWidget.h
│   │   │   ├── NowPlayingWidget.cpp
│   │   │   ├── NowPlayingWidget.h
│   │   │   ├── PlaybackControlsWidget.cpp
│   │   │   ├── PlaybackControlsWidget.h
│   │   │   ├── PlaybackControlsWidget.ui
│   │   │   ├── PointyArrow.cpp
│   │   │   ├── PointyArrow.h
│   │   │   ├── ProfileArtistWidget.cpp
│   │   │   ├── ProfileArtistWidget.h
│   │   │   ├── ProfileWidget.cpp
│   │   │   ├── ProfileWidget.h
│   │   │   ├── ProfileWidget.ui
│   │   │   ├── PushButton.cpp
│   │   │   ├── PushButton.h
│   │   │   ├── RefreshButton.cpp
│   │   │   ├── RefreshButton.h
│   │   │   ├── ScrobbleControls.cpp
│   │   │   ├── ScrobbleControls.h
│   │   │   ├── ScrobblesListWidget.cpp
│   │   │   ├── ScrobblesListWidget.h
│   │   │   ├── ScrobblesWidget.cpp
│   │   │   ├── ScrobblesWidget.h
│   │   │   ├── ScrobblesWidget.ui
│   │   │   ├── ShortcutEdit.cpp
│   │   │   ├── ShortcutEdit.h
│   │   │   ├── SideBar.cpp
│   │   │   ├── SideBar.h
│   │   │   ├── SimilarArtistWidget.cpp
│   │   │   ├── SimilarArtistWidget.h
│   │   │   ├── StatusBar.cpp
│   │   │   ├── StatusBar.h
│   │   │   ├── TagWidget.cpp
│   │   │   ├── TagWidget.h
│   │   │   ├── TitleBar.cpp
│   │   │   ├── TitleBar.h
│   │   │   ├── TrackWidget.cpp
│   │   │   ├── TrackWidget.h
│   │   │   ├── TrackWidget.ui
│   │   │   ├── WidgetTextObject.cpp
│   │   │   └── WidgetTextObject.h
│   │   ├── Wizard/
│   │   │   ├── AccessPage.cpp
│   │   │   ├── AccessPage.h
│   │   │   ├── BootstrapInProgressPage.h
│   │   │   ├── BootstrapPage.cpp
│   │   │   ├── BootstrapPage.h
│   │   │   ├── BootstrapProgressPage.cpp
│   │   │   ├── BootstrapProgressPage.h
│   │   │   ├── FirstRunWizard.cpp
│   │   │   ├── FirstRunWizard.h
│   │   │   ├── FirstRunWizard.ui
│   │   │   ├── LoginPage.cpp
│   │   │   ├── LoginPage.h
│   │   │   ├── PluginsInstallPage.cpp
│   │   │   ├── PluginsInstallPage.h
│   │   │   ├── PluginsPage.cpp
│   │   │   ├── PluginsPage.h
│   │   │   ├── TourFinishPage.cpp
│   │   │   ├── TourFinishPage.h
│   │   │   ├── TourLocationPage.cpp
│   │   │   ├── TourLocationPage.h
│   │   │   ├── TourMetadataPage.cpp
│   │   │   ├── TourMetadataPage.h
│   │   │   ├── TourScrobblesPage.cpp
│   │   │   ├── TourScrobblesPage.h
│   │   │   ├── WizardPage.cpp
│   │   │   └── WizardPage.h
│   │   ├── audioscrobbler.icns
│   │   ├── audioscrobbler.rc
│   │   ├── client.pro
│   │   ├── lastfm-scrobbler.desktop
│   │   ├── main.cpp
│   │   └── qrc/
│   │       └── audioscrobbler.qrc
│   ├── fingerprinter/
│   │   ├── Fingerprinter.cpp
│   │   ├── Fingerprinter.h
│   │   ├── LAV_Source.cpp
│   │   ├── LAV_Source.h
│   │   ├── fingerprinter.pro
│   │   └── main.cpp
│   └── twiddly/
│       ├── IPod.cpp
│       ├── IPod.h
│       ├── IPodScrobble.h
│       ├── IPodSettings.h
│       ├── ITunesLibrary.h
│       ├── ITunesLibraryTrack.h
│       ├── ITunesLibrary_mac.cpp
│       ├── ITunesLibrary_win.cpp
│       ├── PlayCountsDatabase.cpp
│       ├── PlayCountsDatabase.h
│       ├── README
│       ├── Twiddly.rc
│       ├── TwiddlyApplication.cpp
│       ├── TwiddlyApplication.h
│       ├── Utils.cpp
│       ├── Utils.h
│       ├── Utils_mac.mm
│       ├── main.cpp
│       └── twiddly.pro
├── common/
│   ├── HideStupidWarnings.h
│   ├── c++/
│   │   ├── Logger.cpp
│   │   ├── Logger.h
│   │   ├── fileCreationTime.cpp
│   │   ├── mac/
│   │   │   └── getBsdProcessList.c
│   │   ├── string.h
│   │   └── win/
│   │       └── scrobSubPipeName.cpp
│   ├── precompiled.h
│   └── qt/
│       ├── README
│       ├── msleep.cpp
│       ├── override/
│       │   ├── QDebug
│       │   ├── QHttp
│       │   ├── QMessageBox
│       │   ├── QNetworkAccessManager
│       │   └── README
│       ├── reverse.cpp
│       └── sort.cpp
├── i18n/
│   ├── i18n.pro
│   ├── lastfm_de.ts
│   ├── lastfm_en.ts
│   ├── lastfm_es.ts
│   ├── lastfm_fr.ts
│   ├── lastfm_it.ts
│   ├── lastfm_ja.ts
│   ├── lastfm_pl.ts
│   ├── lastfm_pt.ts
│   ├── lastfm_ru.ts
│   ├── lastfm_sv.ts
│   ├── lastfm_tr.ts
│   └── lastfm_zh_CN.ts
├── lib/
│   ├── 3rdparty/
│   │   ├── README
│   │   ├── fetch.sh
│   │   ├── fftw3.h
│   │   ├── iTunesCOMAPI/
│   │   │   ├── LicenseAgreement.rtf
│   │   │   ├── ReadMe.rtf
│   │   │   ├── SampleScripts/
│   │   │   │   ├── CreateAlbumPlaylists.js
│   │   │   │   ├── RemoveDeadTracks.js
│   │   │   │   └── RemoveUserPlaylists.js
│   │   │   ├── iTunesCOM.chm
│   │   │   ├── iTunesCOMInterface.h
│   │   │   └── iTunesCOMInterface_i.c
│   │   ├── mad.h
│   │   ├── patches/
│   │   │   ├── README
│   │   │   └── tbytevector_cpp.patch
│   │   └── samplerate.h
│   ├── DllExportMacro.h
│   ├── listener/
│   │   ├── PlayerCommand.h
│   │   ├── PlayerCommandParser.cpp
│   │   ├── PlayerCommandParser.h
│   │   ├── PlayerConnection.cpp
│   │   ├── PlayerConnection.h
│   │   ├── PlayerListener.cpp
│   │   ├── PlayerListener.h
│   │   ├── PlayerMediator.cpp
│   │   ├── PlayerMediator.h
│   │   ├── State.h
│   │   ├── legacy/
│   │   │   ├── LegacyPlayerListener.cpp
│   │   │   └── LegacyPlayerListener.h
│   │   ├── listener.pro
│   │   ├── mac/
│   │   │   ├── ITunesListener.cpp
│   │   │   ├── ITunesListener.h
│   │   │   ├── SpotifyListener.h
│   │   │   └── SpotifyListener.mm
│   │   ├── mpris2/
│   │   │   ├── Mpris2Listener.cpp
│   │   │   ├── Mpris2Listener.h
│   │   │   ├── Mpris2Service.cpp
│   │   │   └── Mpris2Service.h
│   │   ├── tests/
│   │   │   ├── TestPlayerCommandParser.cpp
│   │   │   └── test_liblistener.pro
│   │   └── win/
│   │       ├── NamedPipeServer.cpp
│   │       ├── NamedPipeServer.h
│   │       ├── SpotifyListener.cpp
│   │       └── SpotifyListener.h
│   ├── logger/
│   │   └── logger.pro
│   └── unicorn/
│       ├── AnimatedPushButton.h
│       ├── AnimatedStatusBar.cpp
│       ├── AnimatedStatusBar.h
│       ├── CrashReporter/
│       │   ├── CrashReporter.cpp
│       │   ├── CrashReporter.h
│       │   └── CrashReporter_mac.mm
│       ├── DesktopServices.cpp
│       ├── DesktopServices.h
│       ├── LoginProcess.cpp
│       ├── LoginProcess.h
│       ├── PlayBus/
│       │   ├── Bus.cpp
│       │   ├── Bus.h
│       │   ├── PlayBus.cpp
│       │   └── PlayBus.h
│       ├── QMessageBoxBuilder.cpp
│       ├── QMessageBoxBuilder.h
│       ├── ScrobblesModel.cpp
│       ├── ScrobblesModel.h
│       ├── SignalBlocker.h
│       ├── TrackImageFetcher.cpp
│       ├── TrackImageFetcher.h
│       ├── UnicornApplication.cpp
│       ├── UnicornApplication.h
│       ├── UnicornApplicationDelegate.h
│       ├── UnicornApplicationDelegate.mm
│       ├── UnicornApplication_mac.mm
│       ├── UnicornCoreApplication.cpp
│       ├── UnicornCoreApplication.h
│       ├── UnicornMainWindow.cpp
│       ├── UnicornMainWindow.h
│       ├── UnicornSession.cpp
│       ├── UnicornSession.h
│       ├── UnicornSettings.cpp
│       ├── UnicornSettings.h
│       ├── UpdateInfoFetcher.cpp
│       ├── UpdateInfoFetcher.h
│       ├── Updater/
│       │   ├── Updater.cpp
│       │   ├── Updater.h
│       │   └── Updater_mac.mm
│       ├── dialogs/
│       │   ├── AboutDialog.cpp
│       │   ├── AboutDialog.h
│       │   ├── AboutDialog.ui
│       │   ├── CloseAppsDialog.cpp
│       │   ├── CloseAppsDialog.h
│       │   ├── CloseAppsDialog.ui
│       │   ├── CloseAppsDialog_mac.mm
│       │   ├── LoginContinueDialog.cpp
│       │   ├── LoginContinueDialog.h
│       │   ├── LoginDialog.cpp
│       │   ├── LoginDialog.h
│       │   ├── ProxyDialog.cpp
│       │   ├── ProxyDialog.h
│       │   ├── ProxyDialog.ui
│       │   ├── ScrobbleConfirmationDialog.cpp
│       │   ├── ScrobbleConfirmationDialog.h
│       │   ├── ScrobbleConfirmationDialog.ui
│       │   ├── ShareDialog.cpp
│       │   ├── ShareDialog.h
│       │   ├── ShareDialog.ui
│       │   ├── TagDialog.cpp
│       │   ├── TagDialog.h
│       │   ├── TagDialog.ui
│       │   ├── UnicornDialog.h
│       │   ├── UserManagerDialog.cpp
│       │   └── UserManagerDialog.h
│       ├── layouts/
│       │   ├── FlowLayout.cpp
│       │   └── FlowLayout.h
│       ├── mac/
│       │   ├── AppleScript.cpp
│       │   └── AppleScript.h
│       ├── notify/
│       │   ├── Notify.h
│       │   └── Notify.mm
│       ├── plugins/
│       │   ├── FooBar08PluginInfo.cpp
│       │   ├── FooBar08PluginInfo.h
│       │   ├── Foobar09PluginInfo.cpp
│       │   ├── Foobar09PluginInfo.h
│       │   ├── IPluginInfo.cpp
│       │   ├── IPluginInfo.h
│       │   ├── ITunesPluginInfo.cpp
│       │   ├── ITunesPluginInfo.h
│       │   ├── ITunesPluginInstaller.cpp
│       │   ├── ITunesPluginInstaller.h
│       │   ├── KillProcess.h
│       │   ├── PluginList.cpp
│       │   ├── PluginList.h
│       │   ├── Version.cpp
│       │   ├── Version.h
│       │   ├── WinampPluginInfo.cpp
│       │   ├── WinampPluginInfo.h
│       │   ├── WmpPluginInfo.cpp
│       │   └── WmpPluginInfo.h
│       ├── qrc/
│       │   ├── spinner.mng
│       │   └── unicorn.qrc
│       ├── qtsingleapplication/
│       │   ├── qtlocalpeer.cpp
│       │   ├── qtlocalpeer.h
│       │   ├── qtlockedfile.cpp
│       │   ├── qtlockedfile.h
│       │   ├── qtlockedfile_unix.cpp
│       │   ├── qtlockedfile_win.cpp
│       │   ├── qtsingleapplication.cpp
│       │   ├── qtsingleapplication.h
│       │   ├── qtsinglecoreapplication.cpp
│       │   └── qtsinglecoreapplication.h
│       ├── qtwin.cpp
│       ├── qtwin.h
│       ├── unicorn.pro
│       └── widgets/
│           ├── ActionButton.cpp
│           ├── ActionButton.h
│           ├── AvatarWidget.cpp
│           ├── AvatarWidget.h
│           ├── BannerWidget.cpp
│           ├── BannerWidget.h
│           ├── DataBox.h
│           ├── DataListWidget.cpp
│           ├── DataListWidget.h
│           ├── FriendsPicker.cpp
│           ├── FriendsPicker.h
│           ├── GhostWidget.cpp
│           ├── GhostWidget.h
│           ├── HttpImageWidget.cpp
│           ├── HttpImageWidget.h
│           ├── ImageButton.cpp
│           ├── ImageButton.h
│           ├── ItemSelectorWidget.cpp
│           ├── ItemSelectorWidget.h
│           ├── Label.cpp
│           ├── Label.h
│           ├── LfmListViewWidget.cpp
│           ├── LfmListViewWidget.h
│           ├── MessageBar.cpp
│           ├── MessageBar.h
│           ├── PlayableMimeData.h
│           ├── ProxyWidget.cpp
│           ├── ProxyWidget.h
│           ├── ProxyWidget.ui
│           ├── SearchBox.cpp
│           ├── SearchBox.h
│           ├── Seed.h
│           ├── SlidingStackedWidget.cpp
│           ├── SlidingStackedWidget.h
│           ├── SpinnerLabel.h
│           ├── StackedWidget.cpp
│           ├── StackedWidget.h
│           ├── StatusLight.cpp
│           ├── StatusLight.h
│           ├── TagListWidget.cpp
│           ├── TagListWidget.h
│           ├── TrackWidget.cpp
│           ├── TrackWidget.h
│           ├── UnicornTabWidget.cpp
│           ├── UnicornTabWidget.h
│           ├── UserComboSelector.h
│           ├── UserManagerWidget.cpp
│           ├── UserManagerWidget.h
│           ├── UserMenu.cpp
│           ├── UserMenu.h
│           ├── UserToolButton.cpp
│           └── UserToolButton.h
└── plugins/
    ├── LFMRadio/
    │   └── PluginInfo.h
    ├── foobar08/
    │   ├── audioscrobbler.cpp
    │   ├── foo_install.iss
    │   └── tools/
    │       └── append_once.bat
    ├── foobar09/
    │   ├── ChangeLog.txt
    │   ├── audioscrobbler.cpp
    │   ├── foo_audioscrobbler.rc
    │   ├── foo_install.iss
    │   ├── foobar_sdk/
    │   │   ├── foobar2000/
    │   │   │   ├── SDK/
    │   │   │   │   ├── abort_callback.cpp
    │   │   │   │   ├── abort_callback.h
    │   │   │   │   ├── advconfig.h
    │   │   │   │   ├── app_close_blocker.cpp
    │   │   │   │   ├── app_close_blocker.h
    │   │   │   │   ├── audio_chunk.cpp
    │   │   │   │   ├── audio_chunk.h
    │   │   │   │   ├── audio_chunk_channel_config.cpp
    │   │   │   │   ├── audio_postprocessor.h
    │   │   │   │   ├── cfg_var.cpp
    │   │   │   │   ├── cfg_var.h
    │   │   │   │   ├── chapterizer.cpp
    │   │   │   │   ├── chapterizer.h
    │   │   │   │   ├── commandline.cpp
    │   │   │   │   ├── commandline.h
    │   │   │   │   ├── completion_notify.cpp
    │   │   │   │   ├── completion_notify.h
    │   │   │   │   ├── component.h
    │   │   │   │   ├── component_client.h
    │   │   │   │   ├── components_menu.h
    │   │   │   │   ├── componentversion.h
    │   │   │   │   ├── config_io_callback.cpp
    │   │   │   │   ├── config_io_callback.h
    │   │   │   │   ├── config_object.cpp
    │   │   │   │   ├── config_object.h
    │   │   │   │   ├── config_object_impl.h
    │   │   │   │   ├── console.cpp
    │   │   │   │   ├── console.h
    │   │   │   │   ├── contextmenu.h
    │   │   │   │   ├── contextmenu_manager.h
    │   │   │   │   ├── core_api.h
    │   │   │   │   ├── coreversion.h
    │   │   │   │   ├── dsp.cpp
    │   │   │   │   ├── dsp.h
    │   │   │   │   ├── dsp_manager.cpp
    │   │   │   │   ├── dsp_manager.h
    │   │   │   │   ├── file_info.cpp
    │   │   │   │   ├── file_info.h
    │   │   │   │   ├── file_info_impl.cpp
    │   │   │   │   ├── file_info_impl.h
    │   │   │   │   ├── file_info_merge.cpp
    │   │   │   │   ├── file_operation_callback.cpp
    │   │   │   │   ├── file_operation_callback.h
    │   │   │   │   ├── filesystem.cpp
    │   │   │   │   ├── filesystem.h
    │   │   │   │   ├── filesystem_helper.cpp
    │   │   │   │   ├── filesystem_helper.h
    │   │   │   │   ├── foobar2000.h
    │   │   │   │   ├── genrand.h
    │   │   │   │   ├── guids.cpp
    │   │   │   │   ├── hasher_md5.cpp
    │   │   │   │   ├── hasher_md5.h
    │   │   │   │   ├── info_lookup_handler.h
    │   │   │   │   ├── initquit.h
    │   │   │   │   ├── input.cpp
    │   │   │   │   ├── input.h
    │   │   │   │   ├── input_file_type.cpp
    │   │   │   │   ├── input_file_type.h
    │   │   │   │   ├── input_impl.h
    │   │   │   │   ├── library_manager.h
    │   │   │   │   ├── link_resolver.cpp
    │   │   │   │   ├── link_resolver.h
    │   │   │   │   ├── main_thread_callback.h
    │   │   │   │   ├── mainmenu.cpp
    │   │   │   │   ├── masstagger_action.h
    │   │   │   │   ├── mem_block_container.cpp
    │   │   │   │   ├── mem_block_container.h
    │   │   │   │   ├── menu.h
    │   │   │   │   ├── menu_helpers.cpp
    │   │   │   │   ├── menu_helpers.h
    │   │   │   │   ├── menu_item.cpp
    │   │   │   │   ├── menu_manager.cpp
    │   │   │   │   ├── message_loop.h
    │   │   │   │   ├── metadb.cpp
    │   │   │   │   ├── metadb.h
    │   │   │   │   ├── metadb_handle.cpp
    │   │   │   │   ├── metadb_handle.h
    │   │   │   │   ├── metadb_handle_list.cpp
    │   │   │   │   ├── modeless_dialog.cpp
    │   │   │   │   ├── modeless_dialog.h
    │   │   │   │   ├── packet_decoder.cpp
    │   │   │   │   ├── packet_decoder.h
    │   │   │   │   ├── play_callback.h
    │   │   │   │   ├── playable_location.cpp
    │   │   │   │   ├── playable_location.h
    │   │   │   │   ├── playback_control.cpp
    │   │   │   │   ├── playback_control.h
    │   │   │   │   ├── playlist.cpp
    │   │   │   │   ├── playlist.h
    │   │   │   │   ├── playlist_loader.cpp
    │   │   │   │   ├── playlist_loader.h
    │   │   │   │   ├── playlist_lock.cpp
    │   │   │   │   ├── popup_message.cpp
    │   │   │   │   ├── popup_message.h
    │   │   │   │   ├── preferences_page.cpp
    │   │   │   │   ├── preferences_page.h
    │   │   │   │   ├── replaygain.cpp
    │   │   │   │   ├── replaygain.h
    │   │   │   │   ├── replaygain_info.cpp
    │   │   │   │   ├── resampler.h
    │   │   │   │   ├── service.cpp
    │   │   │   │   ├── service.h
    │   │   │   │   ├── service_impl.h
    │   │   │   │   ├── shared.h
    │   │   │   │   ├── shortcut_actions.h
    │   │   │   │   ├── stdafx.cpp
    │   │   │   │   ├── tag_processor.cpp
    │   │   │   │   ├── tag_processor.h
    │   │   │   │   ├── tag_processor_id3v2.cpp
    │   │   │   │   ├── threaded_process.cpp
    │   │   │   │   ├── threaded_process.h
    │   │   │   │   ├── titleformat.cpp
    │   │   │   │   ├── titleformat.h
    │   │   │   │   ├── titleformat_config.cpp
    │   │   │   │   ├── titleformat_config.h
    │   │   │   │   ├── track_property.h
    │   │   │   │   ├── ui.cpp
    │   │   │   │   ├── ui.h
    │   │   │   │   ├── unpack.h
    │   │   │   │   ├── utf8api.cpp
    │   │   │   │   └── vis.h
    │   │   │   ├── foo_input_raw/
    │   │   │   │   ├── foo_input_raw.cpp
    │   │   │   │   └── readme.txt
    │   │   │   ├── foo_input_validator/
    │   │   │   │   └── readme.txt
    │   │   │   ├── foobar2000_component_client/
    │   │   │   │   └── component_client.cpp
    │   │   │   ├── helpers/
    │   │   │   │   ├── StdAfx.cpp
    │   │   │   │   ├── StdAfx.h
    │   │   │   │   ├── bitreader_helper.h
    │   │   │   │   ├── cfg_guidlist.h
    │   │   │   │   ├── cfg_structlist.h
    │   │   │   │   ├── create_directory_helper.cpp
    │   │   │   │   ├── create_directory_helper.h
    │   │   │   │   ├── cue_creator.cpp
    │   │   │   │   ├── cue_creator.h
    │   │   │   │   ├── cue_parser.cpp
    │   │   │   │   ├── cue_parser.h
    │   │   │   │   ├── cue_parser_embedding.cpp
    │   │   │   │   ├── cuesheet_index_list.cpp
    │   │   │   │   ├── cuesheet_index_list.h
    │   │   │   │   ├── dialog_resize_helper.cpp
    │   │   │   │   ├── dialog_resize_helper.h
    │   │   │   │   ├── dropdown_helper.cpp
    │   │   │   │   ├── dropdown_helper.h
    │   │   │   │   ├── dynamic_bitrate_helper.cpp
    │   │   │   │   ├── dynamic_bitrate_helper.h
    │   │   │   │   ├── file_cached.h
    │   │   │   │   ├── file_info_const_impl.cpp
    │   │   │   │   ├── file_info_const_impl.h
    │   │   │   │   ├── file_list_helper.cpp
    │   │   │   │   ├── file_list_helper.h
    │   │   │   │   ├── file_move_helper.cpp
    │   │   │   │   ├── file_move_helper.h
    │   │   │   │   ├── file_win32_wrapper.h
    │   │   │   │   ├── file_wrapper_simple.cpp
    │   │   │   │   ├── file_wrapper_simple.h
    │   │   │   │   ├── format_title_group.cpp
    │   │   │   │   ├── format_title_group.h
    │   │   │   │   ├── helpers.h
    │   │   │   │   ├── inplace_edit.cpp
    │   │   │   │   ├── inplace_edit.h
    │   │   │   │   ├── input_helpers.cpp
    │   │   │   │   ├── input_helpers.h
    │   │   │   │   ├── listview_helper.cpp
    │   │   │   │   ├── listview_helper.h
    │   │   │   │   ├── meta_table_builder.h
    │   │   │   │   ├── metadb_io_hintlist.cpp
    │   │   │   │   ├── metadb_io_hintlist.h
    │   │   │   │   ├── mp3_utils.cpp
    │   │   │   │   ├── mp3_utils.h
    │   │   │   │   ├── preload_info_helper.cpp
    │   │   │   │   ├── preload_info_helper.h
    │   │   │   │   ├── search_filter.cpp
    │   │   │   │   ├── search_filter.h
    │   │   │   │   ├── seekabilizer.cpp
    │   │   │   │   ├── seekabilizer.h
    │   │   │   │   ├── stream_buffer_helper.cpp
    │   │   │   │   ├── stream_buffer_helper.h
    │   │   │   │   ├── string_filter.h
    │   │   │   │   ├── text_file_loader.cpp
    │   │   │   │   ├── text_file_loader.h
    │   │   │   │   ├── wildcard.cpp
    │   │   │   │   ├── wildcard.h
    │   │   │   │   ├── win32_dialog.cpp
    │   │   │   │   ├── win32_dialog.h
    │   │   │   │   ├── win32_misc.cpp
    │   │   │   │   ├── win32_misc.h
    │   │   │   │   ├── window_placement_helper.cpp
    │   │   │   │   └── window_placement_helper.h
    │   │   │   └── shared/
    │   │   │       ├── audio_math.h
    │   │   │       ├── shared.h
    │   │   │       ├── shared.lib
    │   │   │       └── win32_misc.h
    │   │   ├── pfc/
    │   │   │   ├── alloc.h
    │   │   │   ├── array.h
    │   │   │   ├── avltree.h
    │   │   │   ├── bit_array.h
    │   │   │   ├── bit_array_impl.h
    │   │   │   ├── bsearch.cpp
    │   │   │   ├── bsearch.h
    │   │   │   ├── bsearch_inline.h
    │   │   │   ├── byte_order_helper.h
    │   │   │   ├── chainlist.h
    │   │   │   ├── com_ptr_t.h
    │   │   │   ├── guid.cpp
    │   │   │   ├── guid.h
    │   │   │   ├── instance_tracker.h
    │   │   │   ├── int_types.h
    │   │   │   ├── license.txt
    │   │   │   ├── list.h
    │   │   │   ├── map.h
    │   │   │   ├── mem_block_mgr.h
    │   │   │   ├── order_helper.h
    │   │   │   ├── other.cpp
    │   │   │   ├── other.h
    │   │   │   ├── pfc.h
    │   │   │   ├── primitives.h
    │   │   │   ├── printf.cpp
    │   │   │   ├── profiler.cpp
    │   │   │   ├── profiler.h
    │   │   │   ├── ptr_list.h
    │   │   │   ├── rcptr.h
    │   │   │   ├── ref_counter.h
    │   │   │   ├── selftest.cpp
    │   │   │   ├── sort.cpp
    │   │   │   ├── sort.h
    │   │   │   ├── stdafx.cpp
    │   │   │   ├── string.cpp
    │   │   │   ├── string.h
    │   │   │   ├── string8_impl.h
    │   │   │   ├── string_conv.cpp
    │   │   │   ├── string_conv.h
    │   │   │   ├── string_list.h
    │   │   │   ├── traits.h
    │   │   │   └── utf8.cpp
    │   │   ├── sdk-license.txt
    │   │   ├── sdk-readme.css
    │   │   └── sdk-readme.html
    │   ├── resource.h
    │   └── tools/
    │       └── append_once.bat
    ├── iTunes/
    │   ├── ChangeLog.txt
    │   ├── IPod.cpp
    │   ├── IPod.h
    │   ├── IPodDetector.h
    │   ├── IPodDetector_mac.cpp
    │   ├── IPodDetector_win.cpp
    │   ├── IPod_mac.cpp
    │   ├── IPod_win.cpp
    │   ├── ITunesComThread.cpp
    │   ├── ITunesComThread.h
    │   ├── ITunesComWrapper.cpp
    │   ├── ITunesComWrapper.h
    │   ├── ITunesEventInterface.h
    │   ├── ITunesExceptions.h
    │   ├── ITunesPlaysDatabase.cpp
    │   ├── ITunesPlaysDatabase.h
    │   ├── ITunesPlaysDatabase_mac.cpp
    │   ├── ITunesPlaysDatabase_win.cpp
    │   ├── ITunesTrack.cpp
    │   ├── ITunesTrack.h
    │   ├── Moose.h
    │   ├── Moose_mac.cpp
    │   ├── Moose_win.cpp
    │   ├── Plist.cpp
    │   ├── Plist.h
    │   ├── README.dist
    │   ├── _iTunes.iss
    │   ├── _iTunes.plist
    │   ├── _iTunes.rc
    │   ├── _iTunes.xcodeproj/
    │   │   └── project.pbxproj
    │   ├── iTunesVisualAPI/
    │   │   ├── iTunesAPI.cpp
    │   │   ├── iTunesAPI.h
    │   │   └── iTunesVisualAPI.h
    │   ├── libs/
    │   │   ├── sqlite3.c
    │   │   └── sqlite3.h
    │   ├── main.cpp
    │   ├── main.h
    │   ├── main_mac.cpp
    │   ├── main_win.cpp
    │   ├── resource.h
    │   ├── scripts/
    │   │   ├── currentTrack.scpt
    │   │   ├── currentTrackLocation.scpt
    │   │   ├── currentTrackPersistentId.scpt
    │   │   ├── playCountForDatabaseId.scpt
    │   │   ├── playCountForPersistentId.scpt
    │   │   └── uninstall.sh
    │   ├── tests/
    │   │   ├── ITunesPlaysDatabaseMac.pro
    │   │   ├── TestITunesPlaysDatabaseMac.cpp
    │   │   ├── comtest.cpp
    │   │   └── tests.pro
    │   └── tools/
    │       └── append_once.bat
    ├── scrobsub/
    │   ├── BlockingClient.cpp
    │   ├── BlockingClient.h
    │   ├── Bootstrap.cpp
    │   ├── Bootstrap.h
    │   ├── Bootstrap.rc
    │   ├── Doxyfile
    │   ├── EncodingUtils.cpp
    │   ├── EncodingUtils.h
    │   ├── RegistryUtils.cpp
    │   ├── RegistryUtils.h
    │   ├── ScrobSub.xcodeproj/
    │   │   └── project.pbxproj
    │   ├── ScrobSubmitter.cpp
    │   ├── ScrobSubmitter.h
    │   ├── StdString.h
    │   ├── resource.h
    │   ├── resource1.h
    │   └── tests/
    │       ├── BlockingClient.cpp
    │       └── EncodingUtils.cpp
    ├── winamp/
    │   ├── AutoChar.h
    │   ├── Dbg.h
    │   ├── GEN.H
    │   ├── Gen_AudioScrobbler.cpp
    │   ├── Gen_AudioScrobbler.dsp
    │   ├── Gen_AudioScrobbler.dsw
    │   ├── Gen_AudioScrobbler.h
    │   ├── Gen_AudioScrobbler.rc
    │   ├── OSVer.cpp
    │   ├── OSVer.h
    │   ├── Registry.cpp
    │   ├── Registry.h
    │   ├── Scrobbler.cpp
    │   ├── Scrobbler.h
    │   ├── StdAfx.cpp
    │   ├── StdAfx.h
    │   ├── StdString.h
    │   ├── StdStringArray.cpp
    │   ├── StdStringArray.h
    │   ├── UTF.cpp
    │   ├── UTF.h
    │   ├── VersionApp.cpp
    │   ├── VersionApp.h
    │   ├── WhatsNew.txt
    │   ├── WinampBootstrap.cpp
    │   ├── WinampBootstrap.h
    │   ├── WinampController.cpp
    │   ├── WinampController.h
    │   ├── WinampScrobbler.cpp
    │   ├── WinampScrobbler.h
    │   ├── comdate.h
    │   ├── dbg.cpp
    │   ├── ml.h
    │   ├── ml_lib.cpp
    │   ├── res/
    │   │   └── Gen_AudioScrobbler.rc2
    │   ├── resource.h
    │   ├── wa_dlg.h
    │   ├── wa_hotkeys.h
    │   ├── wa_ipc.h
    │   ├── winamp_install.iss
    │   └── winampcmd.h
    └── wmp/
        ├── Dbg.h
        ├── OSVer.cpp
        ├── OSVer.h
        ├── Scrobbler.cpp
        ├── Scrobbler.h
        ├── StdAfx.cpp
        ├── StdAfx.h
        ├── StdString.h
        ├── StdStringArray.cpp
        ├── StdStringArray.h
        ├── VersionApp.cpp
        ├── VersionApp.h
        ├── WMPScrobbler.cpp
        ├── WMPScrobbler.h
        ├── WhatsNew.txt
        ├── comdate.h
        ├── dbg.cpp
        ├── resource.h
        ├── tools/
        │   └── append_once.bat
        ├── wmp.h
        ├── wmpBootStrap.cpp
        ├── wmpBootStrap.h
        ├── wmp_install.iss
        ├── wmp_scrobbler.cpp
        ├── wmp_scrobbler.def
        ├── wmp_scrobbler.dsp
        ├── wmp_scrobbler.h
        ├── wmp_scrobbler.rc
        ├── wmp_scrobbler.rgs
        ├── wmp_scrobbler.vcxproj
        ├── wmp_scrobblerEvents.cpp
        ├── wmp_scrobblerdll.cpp
        └── wmpplug.h
Download .txt
Showing preview only (585K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6796 symbols across 623 files)

FILE: admin/dist/mac/build-release.rb
  function clean (line 43) | def clean
  function build (line 49) | def build
  function copy_plugin (line 69) | def copy_plugin
  function sign_app (line 74) | def sign_app
  function create_zip (line 91) | def create_zip
  function create_deltas (line 104) | def create_deltas
  function upload_files (line 129) | def upload_files
  function generate_appcast_xml (line 143) | def generate_appcast_xml

FILE: app/boffin/App.cpp
  function foreach (line 106) | foreach (Phonon::AudioOutputDevice d, Phonon::BackendCapabilities::avail...

FILE: app/boffin/App.h
  function namespace (line 31) | namespace Phonon { class AudioOutput; }
  function namespace (line 40) | namespace lastfm{ class Track; }

FILE: app/boffin/HistoryWidget.h
  function class (line 29) | class HistoryWidget : public QWidget

FILE: app/boffin/LocalCollectionScanner.h
  function class (line 30) | class LocalCollectionScanner : public QObject

FILE: app/boffin/MainWindow.cpp
  function foreach (line 77) | foreach(const QString& s, sources) {

FILE: app/boffin/MainWindow.h
  function class (line 25) | class MainWindow : public unicorn::MainWindow

FILE: app/boffin/MediaPipeline.cpp
  type Thread (line 63) | struct Thread : QThread { using QThread::msleep; }

FILE: app/boffin/MediaPipeline.h
  function namespace (line 28) | namespace Phonon
  function class (line 37) | class MediaPipeline : public QObject

FILE: app/boffin/PickDirsDialog.cpp
  function QStringList (line 95) | QStringList

FILE: app/boffin/PickDirsDialog.h
  function class (line 23) | class PickDirsDialog : public QDialog

FILE: app/boffin/PlaydarHostsModel.cpp
  function QVariant (line 24) | QVariant

FILE: app/boffin/PlaydarHostsModel.h
  function class (line 26) | class PlaydarHostsModel : public QAbstractListModel

FILE: app/boffin/PlaydarTagCloudModel.cpp
  function QVariant (line 123) | QVariant
  function QModelIndex (line 159) | QModelIndex
  function QModelIndex (line 167) | QModelIndex
  function QModelIndex (line 174) | QModelIndex

FILE: app/boffin/PlaydarTagCloudModel.h
  function Q_OBJECT (line 37) | Q_OBJECT

FILE: app/boffin/Playlist.h
  type QList (line 30) | typedef QList<BoffinPlayableItem> ItemList;
  function class (line 32) | class Playlist : public QObject

FILE: app/boffin/PlaylistModel.cpp
  function QVariant (line 46) | QVariant
  function QVariant (line 62) | QVariant
  function QModelIndex (line 87) | QModelIndex

FILE: app/boffin/PlaylistModel.h
  function class (line 26) | class PlaylistModel : public QAbstractItemModel

FILE: app/boffin/PlaylistWidget.h
  function class (line 29) | class PlaylistWidget: public QTreeView {
  function loadFromRql (line 43) | void loadFromRql(QString rql) {
  function onDoubleClicked (line 50) | void onDoubleClicked(const QModelIndex& index) {

FILE: app/boffin/ScanProgressWidget.cpp
  function foreach (line 97) | foreach (QString const path, paths)
  function QImage (line 197) | static inline QImage reflect0rize( const QImage& in )

FILE: app/boffin/ScanProgressWidget.h
  function class (line 27) | class ImageFucker : public QObject
  function public (line 63) | public QGLWidget

FILE: app/boffin/ScrobSocket.cpp
  function QString (line 98) | static inline QString encodeAmp( QString data )

FILE: app/boffin/ScrobSocket.h
  function class (line 32) | class ScrobSocket : public QTcpSocket

FILE: app/boffin/Shuffler.cpp
  function levenshtein (line 27) | int levenshtein(const QString& source, const QString& target)
  function normalisedLevenshtein (line 93) | float
  function BoffinPlayableItem (line 153) | BoffinPlayableItem
  function orderByWorkingWeightDesc (line 197) | bool orderByWorkingWeightDesc(const BoffinPlayableItem& a, const BoffinP...
  function BoffinPlayableItem (line 203) | BoffinPlayableItem
  function foreach (line 247) | foreach(const BoffinPlayableItem& historicItem, m_songHistory) {

FILE: app/boffin/Shuffler.h
  function class (line 28) | class Shuffler : public QObject

FILE: app/boffin/TagBrowserWidget.cpp
  function QStringList (line 66) | QStringList
  function QString (line 76) | QString
  function QString (line 91) | QString

FILE: app/boffin/TagBrowserWidget.h
  function class (line 44) | class RelevanceFilter : public QSortFilterProxyModel
  function showRelevant (line 93) | void showRelevant(bool bShowRelevant)
  function showingRelevant (line 101) | bool showingRelevant()
  function showingAll (line 106) | bool showingAll()
  function QString (line 187) | static QString formatDuration(int seconds)
  function onTagItem (line 218) | void onTagItem(const BoffinTagItem& tagitem)
  function insertTag (line 235) | bool insertTag(const QString& tag, int count)
  function class (line 266) | class TagBrowserWidget : public QWidget

FILE: app/boffin/TagCloudView.cpp
  function QStringList (line 75) | QStringList
  function QModelIndex (line 249) | QModelIndex
  function QRect (line 263) | QRect

FILE: app/boffin/TagCloudView.h
  function class (line 26) | class TagCloudView : public QAbstractItemView

FILE: app/boffin/TagDelegate.cpp
  function QFont (line 25) | static inline QFont font( QFont f, float const weight )
  function QSize (line 35) | static inline QSize margins( float const weight )
  function QSize (line 106) | QSize

FILE: app/boffin/TagDelegate.h
  function class (line 25) | class TagDelegate: public QAbstractItemDelegate

FILE: app/boffin/TrackSource.cpp
  function Track (line 23) | static Track toTrack(const BoffinPlayableItem& item)
  function Track (line 43) | Track
  function BoffinPlayableItem (line 68) | BoffinPlayableItem

FILE: app/boffin/TrackSource.h
  function class (line 32) | class TrackSource

FILE: app/boffin/WordleDialog.h
  function class (line 32) | class WordleDialog : public QDialog

FILE: app/boffin/XspfDialog.cpp
  function foreach (line 54) | foreach(const lastfm::Track& t, xspf.tracks()) {

FILE: app/boffin/XspfDialog.h
  function class (line 32) | class XspfDialog : public QDialog

FILE: app/boffin/XspfReader.h
  function class (line 27) | class XspfReader : public QObject

FILE: app/boffin/comet/CometParser.h
  function class (line 41) | class CometParser : public QObject

FILE: app/boffin/comet/YajlCallbacks.hpp
  class TYajlCallbacks (line 31) | class TYajlCallbacks
    method _null (line 35) | static int _null(void *ctx)
    method _boolean (line 40) | static int _boolean(void *ctx, int boolVal)
    method _number (line 45) | static int _number(void *ctx, const char *numberVal, unsigned int numb...
    method _string (line 50) | static int _string(void *ctx, const unsigned char *stringVal, unsigned...
    method _start_map (line 55) | static int _start_map(void *ctx)
    method _map_key (line 60) | static int _map_key(void *ctx, const unsigned char *key, unsigned int ...
    method _end_map (line 65) | static int _end_map(void *ctx)
    method _start_array (line 70) | static int _start_array(void *ctx)
    method _end_array (line 75) | static int _end_array(void *ctx)

FILE: app/boffin/json_spirit/json_spirit_reader.cpp
  function is_eq (line 57) | bool is_eq( Iter_t first, Iter_t last, const char* c_str )
  function Char_t (line 70) | Char_t hex_to_num( const Char_t c )
  function Char_t (line 79) | Char_t hex_str_to_char( Iter_t& begin )
  function Char_t (line 88) | Char_t unicode_str_to_char( Iter_t& begin )
  function append_esc_char_and_incr_iter (line 102) | void append_esc_char_and_incr_iter( String_t& s,
  function String_t (line 140) | String_t substitute_esc_chars( typename String_t::const_iterator begin,
  function String_t (line 176) | String_t get_str_( typename String_t::const_iterator begin,
  function string (line 189) | string get_str( string::const_iterator begin, string::const_iterator end )
  function wstring (line 194) | wstring get_str( wstring::const_iterator begin, wstring::const_iterator ...
  function String_t (line 200) | String_t get_str( Iter_t begin, Iter_t end )
  class Semantic_actions (line 213) | class Semantic_actions
    method Semantic_actions (line 223) | Semantic_actions( Value_t& value )
    method begin_obj (line 229) | void begin_obj( Char_t c )
    method end_obj (line 236) | void end_obj( Char_t c )
    method begin_array (line 243) | void begin_array( Char_t c )
    method end_array (line 250) | void end_array( Char_t c )
    method new_name (line 257) | void new_name( Iter_t begin, Iter_t end )
    method new_str (line 264) | void new_str( Iter_t begin, Iter_t end )
    method new_true (line 269) | void new_true( Iter_t begin, Iter_t end )
    method new_false (line 276) | void new_false( Iter_t begin, Iter_t end )
    method new_null (line 283) | void new_null( Iter_t begin, Iter_t end )
    method new_int (line 290) | void new_int( int64_t i )
    method new_real (line 295) | void new_real( double d )
    method add_first (line 302) | void add_first( const Value_t& value )
    method begin_compound (line 311) | void begin_compound()
    method end_compound (line 336) | void end_compound()
    method add_to_current (line 346) | void add_to_current( const Value_t& value )
  function throw_error (line 371) | void throw_error( position_iterator< Iter_t > i, const std::string& reas...
  function throw_error (line 377) | void throw_error( Iter_t i, const std::string& reason )
  class Json_grammer (line 385) | class Json_grammer : public grammar< Json_grammer< String_t, Iter_t > >
    method Json_grammer (line 391) | Json_grammer( Semantic_actions_t& semantic_actions )
    method throw_not_value (line 396) | static void throw_not_value( Iter_t begin, Iter_t end )
    method throw_not_array (line 401) | static void throw_not_array( Iter_t begin, Iter_t end )
    method throw_not_object (line 406) | static void throw_not_object( Iter_t begin, Iter_t end )
    method throw_not_pair (line 411) | static void throw_not_pair( Iter_t begin, Iter_t end )
    method throw_not_colon (line 416) | static void throw_not_colon( Iter_t begin, Iter_t end )
    method throw_not_string (line 421) | static void throw_not_string( Iter_t begin, Iter_t end )
    type definition (line 427) | struct definition
      method definition (line 429) | definition( const Json_grammer& self )
  function Iter_t (line 522) | Iter_t read_range_or_throw( Iter_t begin, Iter_t end, Value_t& value )
  function add_posn_iter_and_read_range_or_throw (line 542) | void add_posn_iter_and_read_range_or_throw( Iter_t begin, Iter_t end, Va...
  function read_range (line 553) | bool read_range( Iter_t& begin, Iter_t end, Value_t& value )
  function read_string_or_throw (line 568) | void read_string_or_throw( const String_t& s, Value_t& value )
  function read_string (line 574) | bool read_string( const String_t& s, Value_t& value )
  type Multi_pass_iters (line 582) | struct Multi_pass_iters
    method Multi_pass_iters (line 588) | Multi_pass_iters( Istream_t& is )
  function read_stream (line 601) | bool read_stream( Istream_t& is, Value_t& value )
  function read_stream_or_throw (line 609) | void read_stream_or_throw( Istream_t& is, Value_t& value )

FILE: app/boffin/json_spirit/json_spirit_reader.h
  function namespace (line 18) | namespace json_spirit

FILE: app/boffin/json_spirit/json_spirit_utils.h
  function namespace (line 18) | namespace json_spirit

FILE: app/boffin/json_spirit/json_spirit_value.h
  function namespace (line 22) | namespace json_spirit
  function namespace (line 362) | namespace internal_

FILE: app/boffin/json_spirit/json_spirit_writer.cpp
  type Writer (line 24) | struct Writer
    class Generator (line 37) | class Generator
      method Generator (line 41) | Generator( const Value_t& value, Ostream_t& os, bool pretty )
      method output (line 51) | void output( const Value_t& value )
      method output (line 67) | void output( const Object_t& obj )
      method output (line 72) | void output( const Array_t& arr )
      method output (line 77) | void output( const Pair_t& pair )
      method output (line 82) | void output( const String_t& s )
      method output (line 87) | void output( bool b )
      method output_array_or_obj (line 93) | void output_array_or_obj( const T& t, Char_t start_char, Char_t end_...
      method indent (line 116) | void indent()
      method space (line 126) | void space()
      method new_line (line 131) | void new_line()
      method String_t (line 136) | String_t to_str( const char* c_str )
      method Char_t (line 141) | Char_t to_hex( Char_t c )
      method String_t (line 150) | String_t non_printable_to_string( unsigned int c )
      method add_esc_char (line 164) | bool add_esc_char( Char_t c, String_t& s )
      method String_t (line 180) | String_t add_esc_chars( const String_t& s )
    method write (line 212) | static void write( const Value_t& value, Ostream_t& os, bool pretty )
    method String_t (line 217) | static String_t write( const Value_t& value, bool pretty )

FILE: app/boffin/json_spirit/json_spirit_writer.h
  function namespace (line 18) | namespace json_spirit

FILE: app/boffin/layouts/SideBySideLayout.cpp
  function QLayoutItem (line 71) | QLayoutItem*
  function QSize (line 81) | QSize
  function foreach (line 109) | foreach( QLayoutItem* i, m_itemList )
  function QSize (line 117) | QSize
  function QLayoutItem (line 128) | QLayoutItem*
  function QWidget (line 190) | QWidget*

FILE: app/boffin/layouts/SideBySideLayout.h
  function class (line 34) | class SideBySideLayout : public QLayout

FILE: app/boffin/main.cpp
  function main (line 25) | int main( int argc, char* argv[] )

FILE: app/boffin/playdar/BoffinPlayableItem.cpp
  function BoffinPlayableItem (line 41) | BoffinPlayableItem
  function BoffinPlayableItem (line 60) | BoffinPlayableItem

FILE: app/boffin/playdar/BoffinPlayableItem.h
  function QSharedData (line 27) | struct BoffinPlayableItemData : QSharedData
  function class (line 48) | class BoffinPlayableItem

FILE: app/boffin/playdar/BoffinRqlRequest.h
  function class (line 29) | class BoffinRqlRequest : public CometRequest

FILE: app/boffin/playdar/BoffinTagRequest.h
  type BoffinTagItem (line 29) | struct BoffinTagItem
  function class (line 64) | class BoffinTagRequest : public CometRequest

FILE: app/boffin/playdar/CometRequest.cpp
  function QString (line 29) | const QString&

FILE: app/boffin/playdar/CometRequest.h
  function class (line 27) | class CometRequest : public QObject

FILE: app/boffin/playdar/PlaydarApi.h
  type QList (line 28) | typedef QList< QPair<QString,QString> > ParamList;
  function class (line 30) | class PlaydarApiQtPolicy
  type TPlaydarApi (line 47) | typedef TPlaydarApi<QString, QUrl, ParamList, PlaydarApiQtPolicy> Playda...

FILE: app/boffin/playdar/PlaydarAuthRequest.cpp
  function foreach (line 63) | foreach (Param p, params) {

FILE: app/boffin/playdar/PlaydarAuthRequest.h
  function class (line 29) | class PlaydarAuthRequest

FILE: app/boffin/playdar/PlaydarCometRequest.h
  function class (line 33) | class PlaydarCometRequest : public QObject

FILE: app/boffin/playdar/PlaydarConnection.cpp
  function QStringListModel (line 160) | QStringListModel*
  function TrackResolveRequest (line 166) | TrackResolveRequest*
  function BoffinRqlRequest (line 179) | BoffinRqlRequest*
  function BoffinTagRequest (line 192) | BoffinTagRequest*

FILE: app/boffin/playdar/PlaydarConnection.h
  function class (line 34) | class PlaydarConnection : public QObject

FILE: app/boffin/playdar/PlaydarRosterRequest.h
  function class (line 29) | class PlaydarRosterRequest

FILE: app/boffin/playdar/PlaydarStatRequest.h
  function class (line 29) | class PlaydarStatRequest

FILE: app/boffin/playdar/TPlaydarApi.hpp
  class TPlaydarApi (line 30) | class TPlaydarApi : public Policy
    method TPlaydarApi (line 33) | TPlaydarApi(const StringT& baseUrl, const StringT& token)
    method setAuthToken (line 39) | void setAuthToken(const StringT& token)
    method UrlT (line 44) | UrlT apiCall(const ParamsT& params)
    method UrlT (line 49) | UrlT stat()
    method UrlT (line 57) | UrlT auth1(const StringT& applicationName)
    method UrlT (line 66) | UrlT auth2(const StringT& applicationName, const StringT& formtoken, P...
    method UrlT (line 75) | UrlT getResults(const StringT& qid)
    method UrlT (line 84) | UrlT lanRoster()
    method UrlT (line 91) | UrlT trackResolve(const StringT& artist, const StringT& album, const S...
    method UrlT (line 112) | UrlT boffinTags(const StringT& cometSession, const StringT& qid = Stri...
    method UrlT (line 125) | UrlT boffinTracks(const StringT& cometSession, const StringT& qid, con...
    method UrlT (line 138) | UrlT boffinSummary(const StringT& cometSession, const StringT& qid, co...
    method UrlT (line 149) | UrlT comet(const StringT& session)
    method UrlT (line 158) | UrlT makeUrl(const StringT& path, const ParamsT& params = ParamsT())

FILE: app/boffin/playdar/TrackResolveRequest.h
  function class (line 29) | class TrackResolveRequest : public CometRequest

FILE: app/boffin/playdar/jsonGetMember.cpp
  function jsonGetMember (line 23) | bool jsonGetMember(const QVariantMap& o, const char* key, QString& out)
  function jsonGetMember (line 33) | bool jsonGetMember(const QVariantMap& o, const char* key, int& out)
  function jsonGetMember (line 43) | bool jsonGetMember(const QVariantMap& o, const char* key, double& out)
  function jsonGetMember (line 53) | bool jsonGetMember(const QVariantMap& o, const char* key, float& out)

FILE: app/boffin/sample/SampleFromDistribution.h
  function namespace (line 41) | namespace fm { namespace last { namespace algo {

FILE: app/client/Application.cpp
  function QWidget (line 340) | QWidget*
  function QSystemTrayIcon (line 346) | QSystemTrayIcon*
  function QString (line 420) | QString
  function foreach (line 732) | foreach ( QString const arg, args )

FILE: app/client/Application.h
  function namespace (line 46) | namespace unicorn { class Notify; }
  function class (line 67) | class Application : public unicorn::Application

FILE: app/client/AudioscrobblerSettings.cpp
  function QString (line 46) | QString

FILE: app/client/AudioscrobblerSettings.h
  function class (line 26) | class AudioscrobblerSettings : public unicorn::AppSettings

FILE: app/client/Bootstrapper/AbstractBootstrapper.h
  function class (line 37) | class AbstractBootstrapper : public QObject

FILE: app/client/Bootstrapper/AbstractFileBootstrapper.cpp
  function QDomElement (line 50) | static QDomElement

FILE: app/client/Bootstrapper/AbstractFileBootstrapper.h
  function class (line 37) | class AbstractFileBootstrapper : public AbstractBootstrapper

FILE: app/client/Bootstrapper/ITunesDevice/ITunesParser.h
  function class (line 31) | class ITunesParser : public QXmlContentHandler

FILE: app/client/Bootstrapper/ITunesDevice/MediaDeviceInterface.h
  function class (line 34) | class MediaDeviceInterface : public QObject

FILE: app/client/Bootstrapper/ITunesDevice/itunesdevice.cpp
  function QString (line 33) | QString
  function Track (line 160) | Track
  function Track (line 193) | Track

FILE: app/client/Bootstrapper/ITunesDevice/itunesdevice.h
  function class (line 36) | class ITunesDevice : public QObject

FILE: app/client/Bootstrapper/PluginBootstrapper.h
  function class (line 25) | class PluginBootstrapper :  public AbstractBootstrapper

FILE: app/client/Bootstrapper/iTunesBootstrapper.h
  function class (line 31) | class iTunesBootstrapper : public AbstractFileBootstrapper

FILE: app/client/Dialogs/BetaDialog.h
  function namespace (line 26) | namespace Ui {
  function class (line 30) | class BetaDialog : public QDialog

FILE: app/client/Dialogs/DiagnosticsDialog.h
  function namespace (line 32) | namespace Ui { class DiagnosticsDialog; }
  function class (line 34) | class DiagnosticsDialog : public QDialog
  function class (line 65) | class DelayedLabelText : public QObject

FILE: app/client/Dialogs/LicensesDialog.h
  function namespace (line 26) | namespace Ui {
  function class (line 30) | class LicensesDialog : public QDialog

FILE: app/client/Fingerprinter/AacSource.cpp
  function read_callback (line 448) | uint32_t read_callback( void *user_data, void *buffer, uint32_t length )
  function seek_callback (line 454) | uint32_t seek_callback( void *user_data, uint64_t position )

FILE: app/client/Fingerprinter/AacSource.h
  function class (line 25) | class AacSource : public lastfm::FingerprintableSource

FILE: app/client/Fingerprinter/AacSource_p.h
  function class (line 24) | class AAC_File
  function class (line 53) | class AAC_MP4_File : public AAC_File
  function class (line 75) | class AAC_ADTS_File : public AAC_File

FILE: app/client/Fingerprinter/FlacSource.cpp
  function FLAC__StreamDecoderWriteStatus (line 32) | FLAC__StreamDecoderWriteStatus FlacSource::_write_callback(const FLAC__S...
  function FLAC__StreamDecoderWriteStatus (line 40) | FLAC__StreamDecoderWriteStatus FlacSource::write_callback(const FLAC__Fr...

FILE: app/client/Fingerprinter/FlacSource.h
  function class (line 28) | class FlacSource : public lastfm::FingerprintableSource

FILE: app/client/Fingerprinter/MadSource.cpp
  function f2s (line 60) | inline short f2s(mad_fixed_t f)
  function string (line 95) | string MadSource::MadErrorString(const mad_error& error)

FILE: app/client/Fingerprinter/MadSource.h
  function class (line 32) | class MadSource : public lastfm::FingerprintableSource

FILE: app/client/Fingerprinter/VorbisSource.h
  function class (line 27) | class VorbisSource : public lastfm::FingerprintableSource

FILE: app/client/MainWindow.cpp
  function QString (line 194) | QString
  function QString (line 267) | QString MainWindow::currentCategory() const

FILE: app/client/MainWindow.h
  function namespace (line 39) | namespace unicorn
  function class (line 60) | class MainWindow : public unicorn::MainWindow

FILE: app/client/MediaDevices/DeviceScrobbler.cpp
  function foreach (line 288) | foreach ( const QString file, files )
  function QString (line 372) | QString getIpodMountPath()

FILE: app/client/MediaDevices/DeviceScrobbler.h
  function class (line 41) | class DeviceScrobbler : public QObject

FILE: app/client/MediaDevices/IpodDevice.cpp
  function QString (line 39) | QString
  function QString (line 45) | QString
  function foreach (line 59) | foreach( lastfm::User user, roster )
  function QVariant (line 81) | QVariant

FILE: app/client/MediaDevices/IpodDevice.h
  function class (line 25) | class IpodDevice: public MediaDevice

FILE: app/client/MediaDevices/IpodDevice_linux.cpp
  function uint (line 128) | uint
  function QDateTime (line 141) | QDateTime
  function QSqlDatabase (line 207) | QSqlDatabase
  function QString (line 310) | QString
  function QString (line 319) | QString

FILE: app/client/MediaDevices/IpodDevice_linux.h
  type Itdb_iTunesDB (line 27) | typedef struct _Itdb_iTunesDB Itdb_iTunesDB;
  type Itdb_Track (line 28) | typedef struct _Itdb_Track Itdb_Track;
  type Itdb_Playlist (line 29) | typedef struct _Itdb_Playlist Itdb_Playlist;
  function class (line 31) | class IpodTracksFetcher: public QThread
  function class (line 53) | class IpodDeviceLinux: public MediaDevice

FILE: app/client/MediaDevices/MediaDevice.cpp
  function foreach (line 103) | foreach( lastfm::User user, roster )

FILE: app/client/MediaDevices/MediaDevice.h
  function class (line 30) | class MediaDevice: public QObject

FILE: app/client/Mpris2/DBusAbstractAdaptor.cpp
  function QDBusConnection (line 38) | QDBusConnection DBusAbstractAdaptor::connection() const
  function QString (line 48) | QString DBusAbstractAdaptor::dBusPath() const

FILE: app/client/Mpris2/DBusAbstractAdaptor.h
  function class (line 35) | class PropertiesChangedAdaptor : public QDBusAbstractAdaptor
  function class (line 55) | class DBusAbstractAdaptor : public QDBusAbstractAdaptor

FILE: app/client/Mpris2/MediaPlayer2.cpp
  function QString (line 64) | QString
  function QString (line 71) | QString
  function QStringList (line 78) | QStringList
  function QStringList (line 85) | QStringList

FILE: app/client/Mpris2/MediaPlayer2.h
  function class (line 25) | class MediaPlayer2 : public DBusAbstractAdaptor

FILE: app/client/Mpris2/MediaPlayer2Player.cpp
  function QVariantMap (line 76) | QVariantMap
  function qlonglong (line 137) | qlonglong

FILE: app/client/Mpris2/MediaPlayer2Player.h
  function class (line 29) | class MediaPlayer2Player : public DBusAbstractAdaptor

FILE: app/client/Mpris2/Mpris2.h
  function class (line 26) | class Mpris2 : public QObject

FILE: app/client/PrefPane/FmLastPrefPane.h
  function interface (line 25) | interface FmLastPrefPane : NSPreferencePane {

FILE: app/client/PrefPane/FmLastPrefPanePrefWidget.h
  function class (line 27) | class FmLastPrefPanePrefWidget {

FILE: app/client/PrefPane/FmLastPrefPaneQtView.h
  function interface (line 23) | interface FmLastPrefPaneQtView : NSView {

FILE: app/client/ScrobSocket.cpp
  function QString (line 125) | static inline QString encodeAmp( QString data )

FILE: app/client/ScrobSocket.h
  function class (line 32) | class ScrobSocket : public QLocalSocket

FILE: app/client/Services/AnalyticsService/AnalyticsService.cpp
  function QString (line 95) | QString userTypeToString( lastfm::User::Type type )

FILE: app/client/Services/AnalyticsService/AnalyticsService.h
  function namespace (line 25) | namespace lastfm { class User; }
  function class (line 55) | class AnalyticsService : public QObject

FILE: app/client/Services/AnalyticsService/PersistentCookieJar.cpp
  function foreach (line 55) | foreach (QNetworkCookie cookie, list)

FILE: app/client/Services/AnalyticsService/PersistentCookieJar.h
  function class (line 24) | class PersistentCookieJar : public QNetworkCookieJar

FILE: app/client/Services/RadioService/RadioService.cpp
  function foreach (line 554) | foreach (QByteArray a, audioOutput->outputDevice().propertyNames()) {

FILE: app/client/Services/ScrobbleService/ScrobbleService.cpp
  function connect (line 49) | connect( m_mediator, SIGNAL(activeConnectionChanged( PlayerConnection* )...
  function ScrobbleService (line 86) | ScrobbleService&
  function foreach (line 109) | foreach ( QString bannedPath, exculsionDirs )

FILE: app/client/Services/ScrobbleService/ScrobbleService.h
  function namespace (line 31) | namespace unicorn { class Session; }
  function class (line 37) | class ScrobbleService : public QObject

FILE: app/client/Services/ScrobbleService/StopWatch.cpp
  function ScrobblePoint (line 37) | ScrobblePoint
  function uint (line 49) | uint
  function uint (line 102) | uint

FILE: app/client/Services/ScrobbleService/StopWatch.h
  function namespace (line 27) | namespace audioscrobbler { class Application; }
  function class (line 32) | class StopWatch : public QObject

FILE: app/client/Settings/AccountSettingsWidget.h
  function namespace (line 26) | namespace Ui { class AccountSettingsWidget; }
  function class (line 28) | class AccountSettingsWidget: public SettingsWidget

FILE: app/client/Settings/AdvancedSettingsWidget.h
  function namespace (line 26) | namespace Ui { class AdvancedSettingsWidget; }
  function class (line 28) | class AdvancedSettingsWidget: public SettingsWidget

FILE: app/client/Settings/CheckFileSystemModel.cpp
  function QVariant (line 34) | QVariant

FILE: app/client/Settings/CheckFileSystemModel.h
  function class (line 26) | class CheckFileSystemModel : public QFileSystemModel

FILE: app/client/Settings/CheckFileSystemView.cpp
  function foreach (line 58) | foreach(QString path, list)
  function QStringList (line 64) | QStringList

FILE: app/client/Settings/CheckFileSystemView.h
  function class (line 28) | class CheckFileSystemView : public QTreeView

FILE: app/client/Settings/GeneralSettingsWidget.h
  function namespace (line 26) | namespace Ui {
  function class (line 30) | class GeneralSettingsWidget : public SettingsWidget

FILE: app/client/Settings/IpodSettingsWidget.h
  function namespace (line 26) | namespace Ui { class IpodSettingsWidget; }
  function class (line 28) | class IpodSettingsWidget: public SettingsWidget

FILE: app/client/Settings/PreferencesDialog.h
  function namespace (line 28) | namespace Ui {
  function class (line 32) | class PreferencesDialog : public unicorn::MainWindow

FILE: app/client/Settings/ScrobbleSettingsWidget.h
  function namespace (line 26) | namespace Ui { class ScrobbleSettingsWidget; }
  function class (line 28) | class ScrobbleSettingsWidget: public SettingsWidget

FILE: app/client/Settings/SettingsWidget.h
  function class (line 26) | class SettingsWidget : public QWidget

FILE: app/client/Widgets/BioWidget.h
  function class (line 31) | class BioWidget : public QTextBrowser

FILE: app/client/Widgets/ContextLabel.h
  function class (line 26) | class ContextLabel : public unicorn::Label

FILE: app/client/Widgets/FriendListWidget.cpp
  class FriendWidgetItem (line 45) | class FriendWidgetItem : public QListWidgetItem
  function foreach (line 212) | foreach( const lastfm::XmlQuery& user, lfm["friends"].children( "user" ) )

FILE: app/client/Widgets/FriendListWidget.h
  function namespace (line 29) | namespace unicorn { class Session; }
  function namespace (line 30) | namespace lastfm { class XmlQuery; }
  function namespace (line 31) | namespace lastfm { class User; }
  function namespace (line 33) | namespace Ui { class FriendListWidget; }
  function class (line 35) | class FriendListWidget : public QWidget

FILE: app/client/Widgets/FriendWidget.cpp
  function QString (line 135) | QString
  function QString (line 150) | QString
  function QString (line 211) | QString
  function QString (line 217) | QString

FILE: app/client/Widgets/FriendWidget.h
  function namespace (line 31) | namespace Ui { class FriendWidget; }
  function namespace (line 32) | namespace unicorn { class Label; }
  function class (line 35) | class FriendWidget : public QFrame

FILE: app/client/Widgets/MetadataWidget.cpp
  function ScrobbleControls (line 175) | ScrobbleControls*
  function foreach (line 277) | foreach( const QString& p, bioList ) {
  function foreach (line 413) | foreach ( const XmlQuery& affiliation, lfm["affiliations"]["downloads"]....
  function foreach (line 432) | foreach ( const XmlQuery& affiliation, lfm["affiliations"]["physicals"]....
  function QString (line 597) | QString userLibraryLink( const QString& user, const lastfm::Artist& arti...
  function QString (line 602) | QString userLibraryLink( const QString& user, const lastfm::Track& track )
  function QString (line 607) | QString userLibrary( const QString& user, const lastfm::Artist& artist )
  function QString (line 612) | QString
  function QString (line 620) | QString
  function QString (line 631) | QString

FILE: app/client/Widgets/MetadataWidget.h
  function namespace (line 32) | namespace Ui { class MetadataWidget; }
  function class (line 42) | class MetadataWidget : public QFrame

FILE: app/client/Widgets/NothingPlayingWidget.h
  function namespace (line 26) | namespace lastfm { class User; }
  function namespace (line 27) | namespace unicorn { class Session; }
  function namespace (line 29) | namespace Ui { class NothingPlayingWidget; }
  function class (line 31) | class NothingPlayingWidget : public QFrame

FILE: app/client/Widgets/NowPlayingStackedWidget.h
  function class (line 33) | class NowPlayingStackedWidget : public unicorn::SlidingStackedWidget

FILE: app/client/Widgets/NowPlayingWidget.cpp
  function PlaybackControlsWidget (line 55) | PlaybackControlsWidget*

FILE: app/client/Widgets/NowPlayingWidget.h
  function class (line 28) | class NowPlayingWidget : public QWidget

FILE: app/client/Widgets/PlaybackControlsWidget.cpp
  function setLayoutUsesWidgetRect (line 37) | void

FILE: app/client/Widgets/PlaybackControlsWidget.h
  function namespace (line 30) | namespace unicorn { class Session; }
  function namespace (line 31) | namespace Ui { class PlaybackControlsWidget; }
  function class (line 35) | class PlaybackControlsWidget : public QFrame

FILE: app/client/Widgets/PointyArrow.h
  function class (line 27) | class PointyArrow : public QWidget {

FILE: app/client/Widgets/ProfileArtistWidget.cpp
  class PlaysLabel (line 34) | class PlaysLabel : public QLabel
    method PlaysLabel (line 37) | explicit PlaysLabel( const QString& text, int plays, int maxPlays, QWi...
    method paintEvent (line 44) | void paintEvent( QPaintEvent* event )

FILE: app/client/Widgets/ProfileArtistWidget.h
  function namespace (line 26) | namespace lastfm { class XmlQuery; }
  function class (line 28) | class ProfileArtistWidget : public QFrame

FILE: app/client/Widgets/ProfileWidget.h
  function namespace (line 31) | namespace unicorn { class Label; }
  function namespace (line 33) | namespace Ui { class ProfileWidget; }
  function class (line 35) | class ProfileWidget : public QFrame

FILE: app/client/Widgets/PushButton.h
  function class (line 26) | class PushButton : public QPushButton

FILE: app/client/Widgets/RefreshButton.h
  function class (line 27) | class RefreshButton : public QPushButton

FILE: app/client/Widgets/ScrobbleControls.h
  function namespace (line 29) | namespace unicorn{ class Session; }
  function namespace (line 30) | namespace lastfm{ class User; }
  function class (line 34) | class ScrobbleControls : public QFrame

FILE: app/client/Widgets/ScrobblesListWidget.cpp
  class ScrobblesListWidgetItem (line 42) | class ScrobblesListWidgetItem : public QListWidgetItem
  function foreach (line 418) | foreach ( const XmlQuery& trackXml, lfm["recenttracks"].children("track") )

FILE: app/client/Widgets/ScrobblesListWidget.h
  function namespace (line 31) | namespace lastfm { class Track; }
  function namespace (line 34) | namespace unicorn { class Session; }
  function class (line 38) | class ScrobblesListWidget : public QListWidget

FILE: app/client/Widgets/ScrobblesWidget.h
  function namespace (line 26) | namespace lastfm { class Track; }
  function namespace (line 29) | namespace Ui { class ScrobblesWidget; }
  function class (line 31) | class ScrobblesWidget : public QWidget

FILE: app/client/Widgets/ShortcutEdit.cpp
  function QString (line 169) | QString

FILE: app/client/Widgets/ShortcutEdit.h
  function class (line 26) | class ShortcutEdit : public QComboBox

FILE: app/client/Widgets/SideBar.cpp
  function QAbstractButton (line 36) | QAbstractButton* newButton( const QString& text, QButtonGroup* buttonGro...
  function QString (line 96) | QString

FILE: app/client/Widgets/SideBar.h
  function namespace (line 27) | namespace lastfm { class User; }
  function namespace (line 28) | namespace unicorn { class Session; }
  function class (line 30) | class SideBar : public QFrame

FILE: app/client/Widgets/SimilarArtistWidget.h
  function class (line 26) | class SimilarArtistWidget : public HttpImageWidget

FILE: app/client/Widgets/StatusBar.h
  function namespace (line 28) | namespace Phonon { class VolumeSlider; }
  function namespace (line 29) | namespace unicorn { class Session; }
  function namespace (line 30) | namespace unicorn { class Label; }
  function class (line 32) | class StatusBar : public QStatusBar

FILE: app/client/Widgets/TagWidget.cpp
  function QSize (line 105) | QSize

FILE: app/client/Widgets/TagWidget.h
  function class (line 29) | class TagWidget : public QPushButton

FILE: app/client/Widgets/TitleBar.h
  function class (line 25) | class TitleBar : public QFrame

FILE: app/client/Widgets/TrackWidget.cpp
  function QSize (line 87) | QSize
  function foreach (line 394) | foreach ( const XmlQuery& affiliation, lfm["affiliations"]["downloads"]....
  function foreach (line 413) | foreach ( const XmlQuery& affiliation, lfm["affiliations"]["physicals"]....

FILE: app/client/Widgets/TrackWidget.h
  function namespace (line 28) | namespace Ui { class TrackWidget; }
  function class (line 33) | class TrackWidget : public QPushButton

FILE: app/client/Widgets/WidgetTextObject.cpp
  function QSizeF (line 30) | QSizeF
  function QWidget (line 48) | QWidget*
  function QRectF (line 61) | QRectF

FILE: app/client/Wizard/AccessPage.h
  function namespace (line 26) | namespace lastfm { class User; }
  function namespace (line 28) | namespace unicorn{
  function class (line 33) | class AccessPage : public WizardPage

FILE: app/client/Wizard/BootstrapInProgressPage.h
  function class (line 31) | class BootstrapInProgressPage : public QWizardPage {

FILE: app/client/Wizard/BootstrapPage.cpp
  function foreach (line 106) | foreach ( unicorn::IPluginInfo* plugin, plugins )

FILE: app/client/Wizard/BootstrapPage.h
  function class (line 36) | class BootstrapPage: public WizardPage

FILE: app/client/Wizard/BootstrapProgressPage.h
  function class (line 26) | class BootstrapProgressPage : public WizardPage

FILE: app/client/Wizard/FirstRunWizard.cpp
  function QAbstractButton (line 127) | QAbstractButton*

FILE: app/client/Wizard/FirstRunWizard.h
  function namespace (line 35) | namespace Ui { class FirstRunWizard; }
  function class (line 37) | class FirstRunWizard : public QDialog

FILE: app/client/Wizard/LoginPage.h
  function class (line 26) | class LoginPage : public WizardPage

FILE: app/client/Wizard/PluginsInstallPage.cpp
  function foreach (line 93) | foreach( unicorn::IPluginInfo* plugin, wizard()->pluginList()->installLi...

FILE: app/client/Wizard/PluginsInstallPage.h
  function class (line 26) | class PluginsInstallPage : public WizardPage

FILE: app/client/Wizard/PluginsPage.cpp
  function foreach (line 73) | foreach( unicorn::IPluginInfo* plugin, supportedPlugins )

FILE: app/client/Wizard/PluginsPage.h
  function class (line 25) | class PluginsPage : public WizardPage

FILE: app/client/Wizard/TourFinishPage.h
  function class (line 28) | class TourFinishPage : public WizardPage

FILE: app/client/Wizard/TourLocationPage.h
  function class (line 30) | class TourLocationPage : public WizardPage

FILE: app/client/Wizard/TourMetadataPage.h
  function class (line 27) | class TourMetadataPage : public WizardPage

FILE: app/client/Wizard/TourScrobblesPage.h
  function class (line 26) | class TourScrobblesPage : public WizardPage

FILE: app/client/Wizard/WizardPage.cpp
  function FirstRunWizard (line 48) | FirstRunWizard*

FILE: app/client/Wizard/WizardPage.h
  function class (line 28) | class WizardPage : public QWidget

FILE: app/client/main.cpp
  type lastfm (line 47) | namespace lastfm
  function main (line 52) | int main( int argc, char** argv )
  function cleanup (line 135) | void cleanup()

FILE: app/fingerprinter/Fingerprinter.h
  function namespace (line 26) | namespace lastfm { class FingerprintableSource; }
  function class (line 28) | class Fingerprinter : public QObject

FILE: app/fingerprinter/LAV_Source.cpp
  class LAV_SourcePrivate (line 66) | class LAV_SourcePrivate

FILE: app/fingerprinter/LAV_Source.h
  function class (line 26) | class LAV_Source : public lastfm::FingerprintableSource

FILE: app/fingerprinter/main.cpp
  function main (line 33) | int main(int argc, char *argv[])

FILE: app/twiddly/IPod.cpp
  function IPod (line 35) | IPod* //static
  function QString (line 88) | QString
  function QDir (line 104) | QDir
  function QDomDocument (line 113) | QDomDocument
  function foreach (line 209) | foreach ( const ITunesLibrary::Track& track, tracksToScrobble )
  function QString (line 282) | QString //static

FILE: app/twiddly/IPod.h
  function class (line 32) | class IPod
  function QString (line 86) | QString scrobbleId() const;
  function class (line 128) | class ManualIPod : public IPod

FILE: app/twiddly/IPodScrobble.h
  function MutableTrack (line 27) | struct IPodScrobble : public MutableTrack

FILE: app/twiddly/IPodSettings.h
  type IPodType (line 23) | enum IPodType { IPodUnknownType, IPodAutomaticType, IPodManualType }
  function class (line 29) | class IPodSettings

FILE: app/twiddly/ITunesLibrary.h
  function class (line 35) | class ITunesLibrary

FILE: app/twiddly/ITunesLibraryTrack.h
  function namespace (line 31) | namespace COM
  function QSharedData (line 46) | struct ITunesLibraryTrackData : public QSharedData
  function ITunesLibraryTrackData (line 73) | struct IPodLibraryTrackData : public ITunesLibraryTrackData
  function class (line 92) | class ITunesLibraryTrack
  function class (line 126) | class ITunesLibraryTrack : private PlayCountsDatabase::Track

FILE: app/twiddly/ITunesLibrary_mac.cpp
  function QDateTime (line 91) | static QDateTime

FILE: app/twiddly/ITunesLibrary_win.cpp
  function Track (line 96) | Track

FILE: app/twiddly/PlayCountsDatabase.cpp
  type QtOverrides (line 46) | namespace QtOverrides
    class SqlQuery (line 48) | class SqlQuery : public ::QSqlQuery
      method arse (line 51) | bool arse( bool success )
      method SqlQuery (line 59) | SqlQuery( QSqlDatabase db ) : QSqlQuery( db )
      method exec (line 62) | bool exec()
      method exec (line 67) | bool exec( const QString& sql )
  function QString (line 240) | static QString

FILE: app/twiddly/PlayCountsDatabase.h
  function class (line 39) | class PlayCountsDatabase

FILE: app/twiddly/TwiddlyApplication.h
  function class (line 24) | class TwiddlyApplication : public unicorn::CoreApplication

FILE: app/twiddly/Utils.h
  function class (line 26) | class Utils

FILE: app/twiddly/main.cpp
  function main (line 51) | int
  function writeXml (line 230) | void
  function logException (line 250) | void

FILE: common/c++/Logger.cpp
  type stat (line 59) | struct stat
  function time (line 96) | static inline std::string time()
  function Logger (line 181) | Logger&  //static

FILE: common/c++/Logger.h
  function class (line 35) | class LOGGER_DLLEXPORT Logger

FILE: common/c++/fileCreationTime.cpp
  type common (line 27) | namespace common
    function time_t (line 40) | static time_t
    function time_t (line 59) | static inline time_t

FILE: common/c++/mac/getBsdProcessList.c
  function getBsdProcessList (line 15) | static int

FILE: common/c++/win/scrobSubPipeName.cpp
  function string (line 36) | string
  function DWORD (line 64) | DWORD

FILE: common/qt/msleep.cpp
  type Qt (line 23) | namespace Qt
    function msleep (line 25) | static inline void msleep( uint ms )

FILE: common/qt/reverse.cpp
  type Qt (line 22) | namespace Qt
    function reverse (line 24) | static inline QList<T> reverse( QList<T> list )
    function QStringList (line 34) | static inline QStringList reverse( QList<QString> strings )

FILE: common/qt/sort.cpp
  type Qt (line 24) | namespace Qt
    function QStringList (line 26) | QStringList sort( QStringList input, Qt::CaseSensitivity s )

FILE: lib/3rdparty/fftw3.h
  type fftw_r2r_kind_do_not_use_me (line 93) | enum fftw_r2r_kind_do_not_use_me {
  type fftw_iodim_do_not_use_me (line 99) | struct fftw_iodim_do_not_use_me {

FILE: lib/3rdparty/iTunesCOMAPI/iTunesCOMInterface.h
  type interface (line 46) | typedef interface IITObject IITObject;
  type interface (line 52) | typedef interface IITSource IITSource;
  type interface (line 58) | typedef interface IITSourceCollection
  type interface (line 64) | typedef interface IITEncoder
  type interface (line 70) | typedef interface IITEncoderCollection
  type interface (line 76) | typedef interface IITEQPreset
  type interface (line 82) | typedef interface IITEQPresetCollection
  type interface (line 88) | typedef interface IITPlaylist
  type interface (line 94) | typedef interface IITOperationStatus
  type interface (line 100) | typedef interface IITConvertOperationStatus
  type interface (line 106) | typedef interface IITLibraryPlaylist
  type interface (line 112) | typedef interface IITUserPlaylist
  type interface (line 118) | typedef interface IITTrack IITTrack;
  type interface (line 124) | typedef interface IITTrackCollection
  type interface (line 130) | typedef interface IITVisual IITVisual;
  type interface (line 136) | typedef interface IITVisualCollection
  type interface (line 142) | typedef interface IITWindow IITWindow;
  type interface (line 148) | typedef interface IITBrowserWindow
  type interface (line 154) | typedef interface IITWindowCollection
  type interface (line 160) | typedef interface IiTunes IiTunes;
  type interface (line 166) | typedef interface _IiTunesEvents
  type interface (line 172) | typedef interface _IITConvertOperationStatusEvents
  type class (line 180) | typedef class iTunesApp iTunesApp;
  type iTunesApp (line 182) | typedef struct iTunesApp iTunesApp;
  type class (line 192) | typedef class iTunesConvertOperationStatus
  type iTunesConvertOperationStatus (line 194) | typedef struct iTunesConvertOperationStatus iTunesConvertOperationStatus;
  type interface (line 202) | typedef interface IITArtwork
  type interface (line 208) | typedef interface IITArtworkCollection
  type interface (line 214) | typedef interface IITURLTrack
  type interface (line 220) | typedef interface IITAudioCDPlaylist
  type interface (line 226) | typedef interface IITPlaylistCollection
  type interface (line 232) | typedef interface IITIPodSource
  type interface (line 238) | typedef interface IITFileOrCDTrack
  type interface (line 244) | typedef interface IITPlaylistWindow
  type __MIDL___MIDL_itf_iTunesCOMInterface_0000_0001 (line 264) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0000_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0000_0002 (line 270) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0000_0002
  type __MIDL___MIDL_itf_iTunesCOMInterface_0272_0001 (line 311) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0272_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0272_0002 (line 319) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0272_0002
  type __MIDL___MIDL_itf_iTunesCOMInterface_0272_0003 (line 326) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0272_0003
  type __MIDL___MIDL_itf_iTunesCOMInterface_0272_0004 (line 333) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0272_0004
  type __MIDL___MIDL_itf_iTunesCOMInterface_0272_0005 (line 343) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0272_0005
  type __MIDL___MIDL_itf_iTunesCOMInterface_0272_0006 (line 350) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0272_0006
  type __MIDL___MIDL_itf_iTunesCOMInterface_0275_0001 (line 359) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0275_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0276_0001 (line 373) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0276_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0277_0001 (line 379) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0277_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0283_0001 (line 390) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0283_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0283_0002 (line 400) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0283_0002
  type __MIDL___MIDL_itf_iTunesCOMInterface_0283_0003 (line 407) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0283_0003
  type __MIDL___MIDL_itf_iTunesCOMInterface_0283_0004 (line 414) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0283_0004
  type __MIDL___MIDL_itf_iTunesCOMInterface_0285_0001 (line 424) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0285_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0288_0001 (line 439) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0288_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0291_0001 (line 452) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0291_0001
  type __MIDL___MIDL_itf_iTunesCOMInterface_0291_0002 (line 462) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0291_0002
  type __MIDL___MIDL_itf_iTunesCOMInterface_0291_0003 (line 470) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0291_0003
  type __MIDL___MIDL_itf_iTunesCOMInterface_0297_0001 (line 476) | enum __MIDL___MIDL_itf_iTunesCOMInterface_0297_0001
  type IITObjectVtbl (line 534) | typedef struct IITObjectVtbl
  function interface (line 616) | interface IITObject
  type IITSourceVtbl (line 814) | typedef struct IITSourceVtbl
  function interface (line 912) | interface IITSource
  type IITSourceCollectionVtbl (line 1079) | typedef struct IITSourceCollectionVtbl
  function interface (line 1150) | interface IITSourceCollection
  type IITEncoderVtbl (line 1298) | typedef struct IITEncoderVtbl
  function interface (line 1353) | interface IITEncoder
  type IITEncoderCollectionVtbl (line 1460) | typedef struct IITEncoderCollectionVtbl
  function interface (line 1525) | interface IITEncoderCollection
  type IITEQPresetVtbl (line 1729) | typedef struct IITEQPresetVtbl
  function interface (line 1881) | interface IITEQPreset
  type IITEQPresetCollectionVtbl (line 2349) | typedef struct IITEQPresetCollectionVtbl
  function interface (line 2414) | interface IITEQPresetCollection
  type IITPlaylistVtbl (line 2586) | typedef struct IITPlaylistVtbl
  function interface (line 2730) | interface IITPlaylist
  type IITOperationStatusVtbl (line 3051) | typedef struct IITOperationStatusVtbl
  function interface (line 3106) | interface IITOperationStatus
  type IITConvertOperationStatusVtbl (line 3215) | typedef struct IITConvertOperationStatusVtbl
  function interface (line 3291) | interface IITConvertOperationStatus
  type IITLibraryPlaylistVtbl (line 3453) | typedef struct IITLibraryPlaylistVtbl
  function interface (line 3617) | interface IITLibraryPlaylist
  type IITUserPlaylistVtbl (line 3859) | typedef struct IITUserPlaylistVtbl
  function interface (line 4060) | interface IITUserPlaylist
  type IITTrackVtbl (line 4564) | typedef struct IITTrackVtbl
  function interface (line 4873) | interface IITTrack
  type IITTrackCollectionVtbl (line 5838) | typedef struct IITTrackCollectionVtbl
  function interface (line 5914) | interface IITTrackCollection
  type IITVisualVtbl (line 6075) | typedef struct IITVisualVtbl
  function interface (line 6126) | interface IITVisual
  type IITVisualCollectionVtbl (line 6218) | typedef struct IITVisualCollectionVtbl
  function interface (line 6283) | interface IITVisualCollection
  type IITWindowVtbl (line 6483) | typedef struct IITWindowVtbl
  function interface (line 6630) | interface IITWindow
  type IITBrowserWindowVtbl (line 7083) | typedef struct IITBrowserWindowVtbl
  function interface (line 7250) | interface IITBrowserWindow
  type IITWindowCollectionVtbl (line 7478) | typedef struct IITWindowCollectionVtbl
  function interface (line 7543) | interface IITWindowCollection
  type IiTunesVtbl (line 7940) | typedef struct IiTunesVtbl
  function interface (line 8341) | interface IiTunes
  type _IiTunesEventsVtbl (line 9681) | typedef struct _IiTunesEventsVtbl
  function interface (line 9728) | interface _IiTunesEvents
  type _IITConvertOperationStatusEventsVtbl (line 9787) | typedef struct _IITConvertOperationStatusEventsVtbl
  function interface (line 9834) | interface _IITConvertOperationStatusEvents
  type IITArtworkVtbl (line 9930) | typedef struct IITArtworkVtbl
  function interface (line 10004) | interface IITArtwork
  type IITArtworkCollectionVtbl (line 10181) | typedef struct IITArtworkCollectionVtbl
  function interface (line 10241) | interface IITArtworkCollection
  type IITURLTrackVtbl (line 10398) | typedef struct IITURLTrackVtbl
  function interface (line 10772) | interface IITURLTrack
  type IITAudioCDPlaylistVtbl (line 11307) | typedef struct IITAudioCDPlaylistVtbl
  function interface (line 11482) | interface IITAudioCDPlaylist
  type IITPlaylistCollectionVtbl (line 11754) | typedef struct IITPlaylistCollectionVtbl
  function interface (line 11825) | interface IITPlaylistCollection
  type IITIPodSourceVtbl (line 11974) | typedef struct IITIPodSourceVtbl
  function interface (line 12082) | interface IITIPodSource
  type IITFileOrCDTrackVtbl (line 12397) | typedef struct IITFileOrCDTrackVtbl
  function interface (line 12935) | interface IITFileOrCDTrack
  type IITPlaylistWindowVtbl (line 14068) | typedef struct IITPlaylistWindowVtbl
  function interface (line 14223) | interface IITPlaylistWindow

FILE: lib/3rdparty/iTunesCOMAPI/iTunesCOMInterface_i.c
  type IID (line 50) | typedef struct _IID
  type IID (line 62) | typedef IID CLSID;

FILE: lib/3rdparty/mad.h
  type mad_fixed_t (line 71) | typedef   signed int mad_fixed_t;
  type mad_fixed64hi_t (line 73) | typedef   signed int mad_fixed64hi_t;
  type mad_fixed64lo_t (line 74) | typedef unsigned int mad_fixed64lo_t;
  type mad_fixed_t (line 76) | typedef   signed long mad_fixed_t;
  type mad_fixed64hi_t (line 78) | typedef   signed long mad_fixed64hi_t;
  type mad_fixed64lo_t (line 79) | typedef unsigned long mad_fixed64lo_t;
  type mad_sample_t (line 89) | typedef double mad_sample_t;
  type mad_fixed_t (line 91) | typedef mad_fixed_t mad_sample_t;
  type mad_bitptr (line 551) | struct mad_bitptr {
  type mad_bitptr (line 557) | struct mad_bitptr
  type mad_bitptr (line 561) | struct mad_bitptr
  type mad_bitptr (line 562) | struct mad_bitptr
  type mad_bitptr (line 565) | struct mad_bitptr
  type mad_bitptr (line 567) | struct mad_bitptr
  type mad_bitptr (line 568) | struct mad_bitptr
  type mad_bitptr (line 569) | struct mad_bitptr
  type mad_bitptr (line 571) | struct mad_bitptr
  type mad_timer_t (line 580) | typedef struct {
  type mad_units (line 589) | enum mad_units {
  type mad_units (line 650) | enum mad_units
  type mad_units (line 653) | enum mad_units
  type mad_units (line 653) | enum mad_units
  type mad_error (line 666) | enum mad_error {
  type mad_stream (line 697) | struct mad_stream {
  type mad_stream (line 730) | struct mad_stream
  type mad_stream (line 731) | struct mad_stream
  type mad_stream (line 736) | struct mad_stream
  type mad_stream (line 738) | struct mad_stream
  type mad_stream (line 740) | struct mad_stream
  type mad_stream (line 742) | struct mad_stream
  type mad_layer (line 752) | enum mad_layer {
  type mad_mode (line 758) | enum mad_mode {
  type mad_emphasis (line 765) | enum mad_emphasis {
  type mad_header (line 772) | struct mad_header {
  type mad_frame (line 790) | struct mad_frame {
  type mad_header (line 828) | struct mad_header
  type mad_header (line 832) | struct mad_header
  type mad_stream (line 832) | struct mad_stream
  type mad_frame (line 834) | struct mad_frame
  type mad_frame (line 835) | struct mad_frame
  type mad_frame (line 837) | struct mad_frame
  type mad_stream (line 837) | struct mad_stream
  type mad_frame (line 839) | struct mad_frame
  type mad_pcm (line 849) | struct mad_pcm {
  type mad_synth (line 856) | struct mad_synth {
  type mad_synth (line 882) | struct mad_synth
  type mad_synth (line 886) | struct mad_synth
  type mad_synth (line 888) | struct mad_synth
  type mad_frame (line 888) | struct mad_frame
  type mad_decoder_mode (line 898) | enum mad_decoder_mode {
  type mad_flow (line 903) | enum mad_flow {
  type mad_decoder (line 910) | struct mad_decoder {
  type mad_decoder (line 939) | struct mad_decoder
  type mad_flow (line 940) | enum mad_flow
  type mad_stream (line 940) | struct mad_stream
  type mad_flow (line 941) | enum mad_flow
  type mad_header (line 941) | struct mad_header
  type mad_flow (line 942) | enum mad_flow
  type mad_stream (line 943) | struct mad_stream
  type mad_frame (line 944) | struct mad_frame
  type mad_flow (line 945) | enum mad_flow
  type mad_header (line 946) | struct mad_header
  type mad_pcm (line 947) | struct mad_pcm
  type mad_flow (line 948) | enum mad_flow
  type mad_stream (line 949) | struct mad_stream
  type mad_frame (line 950) | struct mad_frame
  type mad_flow (line 951) | enum mad_flow
  type mad_decoder (line 952) | struct mad_decoder
  type mad_decoder (line 957) | struct mad_decoder
  type mad_decoder_mode (line 957) | enum mad_decoder_mode
  type mad_decoder (line 958) | struct mad_decoder

FILE: lib/3rdparty/samplerate.h
  type SRC_STATE (line 33) | typedef struct SRC_STATE_tag SRC_STATE ;
  type SRC_DATA (line 36) | typedef struct
  type SRC_CB_DATA (line 48) | typedef struct

FILE: lib/listener/PlayerCommand.h
  type PlayerCommand (line 23) | enum PlayerCommand

FILE: lib/listener/PlayerCommandParser.cpp
  function PlayerCommand (line 76) | PlayerCommand
  type mxcl (line 99) | namespace mxcl
    function QStringList (line 102) | QStringList static inline split( QString line )
  type Pair (line 122) | struct Pair
    method Pair (line 124) | Pair( const QString& s )
  function foreach (line 144) | foreach (Pair pair, mxcl::split( line ))
  function QString (line 159) | QString
  function Track (line 180) | Track

FILE: lib/listener/PlayerCommandParser.h
  function class (line 33) | class PlayerCommandParser

FILE: lib/listener/PlayerConnection.cpp
  class Error (line 26) | class Error
    method Error (line 30) | Error( const char* msg ) : m_msg( msg ) {}
    method isFatal (line 35) | virtual bool isFatal() const { return false; }
  type NonFatalError (line 38) | struct NonFatalError : public Error
    method NonFatalError (line 40) | NonFatalError( const char* msg ) : Error( msg ) {}
  type FatalError (line 43) | struct FatalError : public Error
    method FatalError (line 45) | FatalError( const char* msg ) : Error( msg ) {}
    method isFatal (line 46) | virtual bool isFatal() const { return true; }

FILE: lib/listener/PlayerConnection.h
  function setElapsed (line 64) | void setElapsed( uint i ) { m_elapsed = i; }
  function clear (line 67) | void clear() { m_state = Stopped; m_track = Track(); m_elapsed = 0; }

FILE: lib/listener/PlayerListener.cpp
  function QString (line 91) | QString

FILE: lib/listener/PlayerMediator.h
  function PlayerConnection (line 46) | PlayerConnection* activeConnection() const { return m_active; }

FILE: lib/listener/State.h
  type State (line 23) | enum State

FILE: lib/listener/legacy/LegacyPlayerListener.h
  function uint (line 39) | static uint port() { return 33367; }

FILE: lib/listener/mac/ITunesListener.cpp
  type ITunesConnection (line 26) | struct ITunesConnection : PlayerConnection
    method QString (line 32) | QString runtimeName() const { return m_runtime_name; }
    method QString (line 33) | QString runtimeId() const { return m_runtime_id; }
    method ITunesConnection (line 35) | ITunesConnection(bool isAppleMusic) : PlayerConnection( "osx", "iTunes" )
    method start (line 40) | void start( const Track& t )
    method pause (line 50) | void pause() { handleCommand( CommandPause ); }
    method resume (line 51) | void resume() { handleCommand( CommandResume ); }
    method stop (line 52) | void stop() { handleCommand( CommandStop ); }
  class ITunesDictionaryHelper (line 123) | class ITunesDictionaryHelper
    method ITunesDictionaryHelper (line 128) | ITunesDictionaryHelper( CFDictionaryRef info )
    method T (line 140) | T
    method getState (line 146) | ITunesListener::State
  function QString (line 162) | QString
  function QString (line 197) | static inline QString
  function QString (line 266) | QString //static

FILE: lib/listener/mac/ITunesListener.h
  function class (line 29) | class ITunesListener : public QObject

FILE: lib/listener/mac/SpotifyListener.h
  function class (line 28) | class SpotifyListenerMac : public QObject

FILE: lib/listener/mpris2/Mpris2Listener.cpp
  class Mpris2Connection (line 28) | class Mpris2Connection : public PlayerConnection
    method Mpris2Connection (line 31) | Mpris2Connection() : PlayerConnection( "mpris2", "" )
    method start (line 34) | void start( const Track& t )
    method pause (line 43) | void pause() { handleCommand( CommandPause ); }
    method resume (line 44) | void resume() { handleCommand( CommandResume ); }
    method stop (line 45) | void stop() { handleCommand( CommandStop ); }
  function foreach (line 55) | foreach( const QString& name, serviceNames )

FILE: lib/listener/mpris2/Mpris2Listener.h
  function class (line 31) | class Mpris2Listener : public QObject

FILE: lib/listener/mpris2/Mpris2Service.cpp
  function QVariantMap (line 32) | static
  function QVariant (line 71) | QVariant
  function QString (line 82) | QString
  function QString (line 89) | QString
  function QString (line 96) | QString
  function QString (line 103) | QString
  function QString (line 113) | QString
  function uint (line 120) | uint
  function QString (line 127) | QString

FILE: lib/listener/mpris2/Mpris2Service.h
  function class (line 28) | class Mpris2Service : public QObject

FILE: lib/listener/tests/TestPlayerCommandParser.cpp
  class TestPlayerCommandParser (line 24) | class TestPlayerCommandParser : public QObject

FILE: lib/listener/win/NamedPipeServer.cpp
  function VOID (line 293) | VOID
  function BOOL (line 319) | BOOL

FILE: lib/listener/win/NamedPipeServer.h
  function class (line 26) | class NamedPipeServer : public QThread

FILE: lib/listener/win/SpotifyListener.cpp
  class SpotifyConnection (line 26) | class SpotifyConnection : public PlayerConnection
    method SpotifyConnection (line 29) | SpotifyConnection() : PlayerConnection( "spt", "Spotify" )
    method start (line 32) | void start( const Track& t )
    method pause (line 42) | void pause() { handleCommand( CommandPause ); }
    method resume (line 43) | void resume() { handleCommand( CommandResume ); }
    method stop (line 44) | void stop() { handleCommand( CommandStop ); }
  function BOOL (line 61) | BOOL CALLBACK

FILE: lib/listener/win/SpotifyListener.h
  type State (line 36) | enum State

FILE: lib/unicorn/AnimatedPushButton.h
  function class (line 28) | class AnimatedPushButton : public QPushButton

FILE: lib/unicorn/CrashReporter/CrashReporter.cpp
  function FilterCallback (line 35) | bool
  function MinidumpCallback (line 42) | bool

FILE: lib/unicorn/CrashReporter/CrashReporter.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/DesktopServices.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/LoginProcess.cpp
  type unicorn (line 42) | namespace unicorn

FILE: lib/unicorn/LoginProcess.h
  function namespace (line 33) | namespace unicorn

FILE: lib/unicorn/PlayBus/Bus.h
  function namespace (line 26) | namespace unicorn

FILE: lib/unicorn/PlayBus/PlayBus.cpp
  function QByteArray (line 51) | const QByteArray&
  function QByteArray (line 63) | QByteArray
  function foreach (line 90) | foreach( QLocalSocket* socket, m_sockets )
  function foreach (line 117) | foreach( QLocalSocket* socket, m_sockets ) {
  function foreach (line 221) | foreach( QLocalSocket* aSocket, m_sockets )
  function QStringList (line 259) | const QStringList

FILE: lib/unicorn/PlayBus/PlayBus.h
  function namespace (line 42) | namespace unicorn

FILE: lib/unicorn/QMessageBoxBuilder.cpp
  function QMessageBoxBuilder (line 84) | QMessageBoxBuilder&
  function QMessageBoxBuilder (line 96) | QMessageBoxBuilder&

FILE: lib/unicorn/QMessageBoxBuilder.h
  function namespace (line 36) | namespace unicorn {
  function class (line 112) | class UNICORN_DLLEXPORT QMessageBoxBuilder

FILE: lib/unicorn/ScrobblesModel.cpp
  function QString (line 42) | QString
  function QString (line 48) | QString
  function QString (line 54) | QString
  function QDateTime (line 60) | QDateTime
  function QVariant (line 83) | QVariant
  function QVariant (line 153) | QVariant
  function QVariant (line 212) | QVariant

FILE: lib/unicorn/SignalBlocker.h
  function Q_OBJECT (line 38) | Q_OBJECT
  function start (line 54) | bool start()
  function onSignaled (line 63) | void onSignaled()
  function onTimeout (line 70) | void onTimeout()

FILE: lib/unicorn/TrackImageFetcher.cpp
  function QUrl (line 222) | QUrl

FILE: lib/unicorn/UnicornApplication.cpp
  function SignalBlocker (line 151) | SignalBlocker( m_bus, SIGNAL( sessionChanged( const QMap<QString, QStrin...
  function SignalBlocker (line 173) | SignalBlocker( m_bus, SIGNAL( sessionChanged( const QMap<QString, QStrin...
  function QMainWindow (line 482) | QMainWindow*
  function OSStatus (line 494) | OSStatus /* static */

FILE: lib/unicorn/UnicornApplication.h
  function namespace (line 41) | namespace lastfm{
  function namespace (line 49) | namespace unicorn

FILE: lib/unicorn/UnicornApplicationDelegate.h
  function class (line 30) | class UnicornApplicationDelegateCommandObserver

FILE: lib/unicorn/UnicornCoreApplication.cpp
  function QFileInfo (line 114) | QFileInfo
  function catch (line 138) | catch(...)

FILE: lib/unicorn/UnicornCoreApplication.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/UnicornMainWindow.cpp
  function foreach (line 97) | foreach ( QAction* button, m_thumbButtonActions )

FILE: lib/unicorn/UnicornMainWindow.h
  function show (line 52) | void show()
  function namespace (line 61) | namespace lastfm { class User; }
  function namespace (line 63) | namespace unicorn

FILE: lib/unicorn/UnicornSession.cpp
  type unicorn (line 32) | namespace unicorn {
    function QNetworkReply (line 75) | QNetworkReply*
    function QNetworkReply (line 83) | QNetworkReply*
    function QString (line 92) | QString
    function QString (line 141) | QString
    function QDataStream (line 293) | QDataStream&
    function QDataStream (line 303) | QDataStream&
  function QDataStream (line 314) | QDataStream& operator<<( QDataStream& out, const unicorn::Session& s ){ ...
  function QDataStream (line 315) | QDataStream& operator>>( QDataStream& in, unicorn::Session& s ){ return ...

FILE: lib/unicorn/UnicornSession.h
  type Info (line 40) | struct Info

FILE: lib/unicorn/UnicornSettings.cpp
  function foreach (line 34) | foreach( QString child, childGroups()) {
  function QString (line 249) | QString
  function quint32 (line 261) | quint32
  function QDateTime (line 273) | QDateTime
  function QString (line 285) | QString
  function QStringList (line 357) | QStringList

FILE: lib/unicorn/UnicornSettings.h
  type SessionInfo (line 98) | struct SessionInfo

FILE: lib/unicorn/UpdateInfoFetcher.cpp
  function foreach (line 66) | foreach( QString group, s.childGroups()) {
  function foreach (line 108) | foreach( const XmlQuery& plugin, plugins ) {
  function QNetworkReply (line 114) | QNetworkReply*

FILE: lib/unicorn/UpdateInfoFetcher.h
  function namespace (line 28) | namespace lastfm{ class XmlQuery; }
  type BootstrapType (line 33) | enum BootstrapType{ NoBootstrap, ClientBootstrap, PluginBootstrap }
  function isInstalled (line 52) | bool isInstalled() const;

FILE: lib/unicorn/Updater/Updater.h
  function namespace (line 30) | namespace qtsparkle { class Updater; }
  function namespace (line 38) | namespace unicorn

FILE: lib/unicorn/dialogs/AboutDialog.h
  function namespace (line 23) | namespace Ui { class AboutDialog; }

FILE: lib/unicorn/dialogs/CloseAppsDialog.cpp
  function QStringList (line 137) | QStringList
  function QStringList (line 143) | QStringList

FILE: lib/unicorn/dialogs/CloseAppsDialog.h
  function namespace (line 28) | namespace Ui { class CloseAppsDialog; }
  function namespace (line 30) | namespace unicorn

FILE: lib/unicorn/dialogs/LoginContinueDialog.h
  function Q_OBJECT (line 29) | Q_OBJECT

FILE: lib/unicorn/dialogs/LoginDialog.h
  function Q_OBJECT (line 31) | Q_OBJECT

FILE: lib/unicorn/dialogs/ProxyDialog.h
  function namespace (line 28) | namespace Ui { class ProxyDialog; }
  function namespace (line 30) | namespace unicorn

FILE: lib/unicorn/dialogs/ScrobbleConfirmationDialog.cpp
  function QStringList (line 114) | const QStringList&

FILE: lib/unicorn/dialogs/ScrobbleConfirmationDialog.h
  function namespace (line 30) | namespace Ui { class ScrobbleConfirmationDialog; }

FILE: lib/unicorn/dialogs/ShareDialog.h
  function namespace (line 29) | namespace Ui { class ShareDialog; }

FILE: lib/unicorn/dialogs/TagDialog.h
  function namespace (line 29) | namespace Ui { class TagDialog; }

FILE: lib/unicorn/dialogs/UnicornDialog.h
  function namespace (line 33) | namespace unicorn {

FILE: lib/unicorn/dialogs/UserManagerDialog.h
  function namespace (line 30) | namespace lastfm{ class User; }

FILE: lib/unicorn/layouts/FlowLayout.cpp
  function QLayoutItem (line 117) | QLayoutItem *FlowLayout::itemAt(int index) const
  function QLayoutItem (line 122) | QLayoutItem *FlowLayout::takeAt(int index)
  function QSize (line 158) | QSize FlowLayout::sizeHint() const
  function QSize (line 163) | QSize FlowLayout::minimumSize() const
  function foreach (line 188) | foreach (item, itemList) {

FILE: lib/unicorn/layouts/FlowLayout.h
  function setOneLine (line 60) | void setOneLine( bool oneLine ) { m_oneLine = oneLine; }

FILE: lib/unicorn/mac/AppleScript.cpp
  function QString (line 56) | static inline QString
  function QString (line 119) | QString
  function QString (line 169) | QString //static

FILE: lib/unicorn/mac/AppleScript.h
  function class (line 31) | class AppleScript

FILE: lib/unicorn/notify/Notify.h
  function namespace (line 29) | namespace lastfm { class Track; }
  function namespace (line 31) | namespace unicorn

FILE: lib/unicorn/plugins/FooBar08PluginInfo.cpp
  function QString (line 35) | QString
  function QString (line 41) | QString
  function QString (line 47) | QString
  function QString (line 53) | QString
  function QString (line 71) | QString

FILE: lib/unicorn/plugins/FooBar08PluginInfo.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/plugins/Foobar09PluginInfo.cpp
  function QString (line 36) | QString
  function QString (line 42) | QString
  function QString (line 48) | QString
  function QString (line 54) | QString
  function QString (line 72) | QString

FILE: lib/unicorn/plugins/Foobar09PluginInfo.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/plugins/IPluginInfo.cpp
  function BOOL (line 123) | BOOL
  function QString (line 167) | QString
  function QString (line 173) | QString

FILE: lib/unicorn/plugins/IPluginInfo.h
  function namespace (line 36) | namespace unicorn

FILE: lib/unicorn/plugins/ITunesPluginInfo.cpp
  function QString (line 35) | QString
  function QString (line 41) | QString
  function QString (line 47) | QString
  function QString (line 53) | QString
  function QString (line 79) | QString

FILE: lib/unicorn/plugins/ITunesPluginInfo.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/plugins/ITunesPluginInstaller.cpp
  function QString (line 37) | QString
  function QString (line 43) | QString
  function deleteDir (line 222) | static bool
  function copyDir (line 260) | static bool
  function QByteArray (line 297) | static inline QByteArray

FILE: lib/unicorn/plugins/ITunesPluginInstaller.h
  function namespace (line 29) | namespace unicorn

FILE: lib/unicorn/plugins/KillProcess.h
  type LONG (line 36) | typedef LONG    NTSTATUS;
  type LONG (line 37) | typedef LONG    KPRIORITY;
  type CLIENT_ID (line 45) | typedef struct _CLIENT_ID {
  type UNICODE_STRING (line 50) | typedef struct _UNICODE_STRING {
  type VM_COUNTERS (line 56) | typedef struct _VM_COUNTERS {
  type SYSTEM_THREADS (line 70) | typedef struct _SYSTEM_THREADS {
  type SYSTEM_PROCESSES (line 89) | typedef struct _SYSTEM_PROCESSES {
  function class (line 110) | class CKillProcessHelper

FILE: lib/unicorn/plugins/PluginList.cpp
  function foreach (line 28) | foreach( IPluginInfo* plugin, m_plugins )
  function foreach (line 42) | foreach( IPluginInfo* plugin, m_plugins )
  function foreach (line 54) | foreach( IPluginInfo* plugin, installedPlugins() )
  function foreach (line 76) | foreach( IPluginInfo* i, m_plugins )
  function foreach (line 89) | foreach( IPluginInfo* i, m_plugins )
  function QString (line 98) | QString
  function foreach (line 117) | foreach( IPluginInfo* plugin, m_plugins )

FILE: lib/unicorn/plugins/PluginList.h
  function namespace (line 33) | namespace unicorn

FILE: lib/unicorn/plugins/Version.cpp
  function QString (line 76) | QString

FILE: lib/unicorn/plugins/Version.h
  function namespace (line 27) | namespace unicorn

FILE: lib/unicorn/plugins/WinampPluginInfo.cpp
  function QString (line 35) | QString
  function QString (line 41) | QString
  function QString (line 47) | QString
  function QString (line 53) | QString
  function QString (line 71) | QString

FILE: lib/unicorn/plugins/WinampPluginInfo.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/plugins/WmpPluginInfo.cpp
  function QString (line 35) | QString
  function QString (line 41) | QString
  function QString (line 47) | QString
  function QString (line 53) | QString
  function QString (line 71) | QString

FILE: lib/unicorn/plugins/WmpPluginInfo.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/qtsingleapplication/qtlocalpeer.cpp
  type QtLP_Private (line 63) | namespace QtLP_Private {
  type timespec (line 157) | struct timespec

FILE: lib/unicorn/qtsingleapplication/qtlocalpeer.h
  function namespace (line 52) | namespace QtLP_Private {
  function class (line 56) | class QtLocalPeer : public QObject

FILE: lib/unicorn/qtsingleapplication/qtlockedfile.h
  type LockMode (line 74) | enum LockMode { NoLock = 0, ReadLock, WriteLock }

FILE: lib/unicorn/qtsingleapplication/qtlockedfile_unix.cpp
  type flock (line 70) | struct flock
  type flock (line 100) | struct flock

FILE: lib/unicorn/qtsingleapplication/qtlockedfile_win.cpp
  function foreach (line 195) | foreach(Qt::HANDLE mutex, rmutexes) {

FILE: lib/unicorn/qtsingleapplication/qtsingleapplication.cpp
  function QString (line 273) | QString QtSingleApplication::id() const
  function QWidget (line 307) | QWidget* QtSingleApplication::activationWindow() const

FILE: lib/unicorn/qtsingleapplication/qtsinglecoreapplication.cpp
  function QString (line 142) | QString QtSingleCoreApplication::id() const

FILE: lib/unicorn/qtwin.cpp
  type _DWM_BLURBEHIND (line 27) | struct _DWM_BLURBEHIND
  type _MARGINS (line 35) | struct _MARGINS
  class WindowNotifier (line 59) | class WindowNotifier : public QWidget
    method WindowNotifier (line 62) | WindowNotifier() { winId(); }
    method addWidget (line 63) | void addWidget(QWidget *widget) { widgets.append(widget); }
    method removeWidget (line 64) | void removeWidget(QWidget *widget) { widgets.removeAll(widget); }
  function resolveLibs (line 71) | static bool resolveLibs()
  function QColor (line 182) | QColor QtWin::colorizatinColor()
  function WindowNotifier (line 201) | WindowNotifier *QtWin::windowNotifier()
    method WindowNotifier (line 62) | WindowNotifier() { winId(); }
    method addWidget (line 63) | void addWidget(QWidget *widget) { widgets.append(widget); }
    method removeWidget (line 64) | void removeWidget(QWidget *widget) { widgets.removeAll(widget); }
  function foreach (line 215) | foreach(QWidget * widget, widgets) {

FILE: lib/unicorn/qtwin.h
  function class (line 23) | class UNICORN_DLLEXPORT QtWin

FILE: lib/unicorn/widgets/BannerWidget.cpp
  function QSize (line 80) | QSize

FILE: lib/unicorn/widgets/BannerWidget.h
  function class (line 67) | class BannerWidgetPrivate : public QAbstractButton

FILE: lib/unicorn/widgets/DataListWidget.cpp
  class DataItem (line 38) | class DataItem : public QLabel
    method DataItem (line 41) | explicit DataItem( const QString& text, const QUrl& url )
    method QUrl (line 51) | QUrl url() const{ return m_url; }
    method mouseReleaseEvent (line 54) | void mouseReleaseEvent( QMouseEvent* event )
    method mousePressEvent (line 62) | void mousePressEvent(QMouseEvent *event)
    method mouseMoveEvent (line 69) | void mouseMoveEvent(QMouseEvent *event)

FILE: lib/unicorn/widgets/FriendsPicker.h
  function Q_OBJECT (line 29) | Q_OBJECT

FILE: lib/unicorn/widgets/HttpImageWidget.h
  type ScaleType (line 37) | enum ScaleType

FILE: lib/unicorn/widgets/ItemSelectorWidget.cpp
  function foreach (line 137) | foreach ( const QLabel* item, m_items )
  function QStringList (line 146) | QStringList

FILE: lib/unicorn/widgets/ItemSelectorWidget.h
  function Q_OBJECT (line 30) | Q_OBJECT
  type Type (line 38) | enum Type

FILE: lib/unicorn/widgets/Label.cpp
  function QString (line 72) | QString
  function QString (line 81) | QString
  function QString (line 87) | QString
  function QString (line 112) | QString
  function QString (line 164) | QString
  function QSize (line 196) | QSize

FILE: lib/unicorn/widgets/Label.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/widgets/LfmListViewWidget.cpp
  function QSize (line 68) | QSize LfmDelegate::sizeHint( const QStyleOptionViewItem& opt, const QMod...
  function QPixmap (line 89) | QPixmap LfmDelegate::defaultImage() const
  function QVariant (line 161) | QVariant

FILE: lib/unicorn/widgets/LfmListViewWidget.h
  function namespace (line 37) | namespace lastfm { class AbstractType; }
  function QPixmap (line 51) | QPixmap defaultImage() const;
  function namespace (line 82) | namespace lastfm {
  type DataRole (line 94) | enum DataRole { WwwRole = Qt::UserRole,
  function QAbstractListModel (line 97) | QAbstractListModel( parent ){}
  function clear (line 115) | void clear()

FILE: lib/unicorn/widgets/MessageBar.h
  function Q_OBJECT (line 37) | Q_OBJECT

FILE: lib/unicorn/widgets/PlayableMimeData.h
  function class (line 30) | class PlayableMimeData : public QMimeData

FILE: lib/unicorn/widgets/ProxyWidget.h
  function namespace (line 28) | namespace Ui { class ProxyWidget; }
  function namespace (line 30) | namespace unicorn

FILE: lib/unicorn/widgets/SearchBox.cpp
  function QNetworkReply (line 114) | QNetworkReply*
  function QStringList (line 120) | QStringList
  function QNetworkReply (line 137) | QNetworkReply*
  function QStringList (line 143) | QStringList
  function CaseInsensitiveLessThan (line 161) | int CaseInsensitiveLessThan(const QString& s1, const QString &s2)
  function QNetworkReply (line 191) | QNetworkReply*
  function QStringList (line 201) | QStringList

FILE: lib/unicorn/widgets/SearchBox.h
  function namespace (line 31) | namespace lastfm {
  function finishEdit (line 90) | void finishEdit(){ emit editingFinished(); }

FILE: lib/unicorn/widgets/Seed.h
  function class (line 26) | class Seed : public QObject

FILE: lib/unicorn/widgets/SlidingStackedWidget.cpp
  type QEasingCurve::Type (line 41) | enum QEasingCurve::Type
  type t_direction (line 67) | enum t_direction

FILE: lib/unicorn/widgets/SlidingStackedWidget.h
  function namespace (line 29) | namespace unicorn {

FILE: lib/unicorn/widgets/SpinnerLabel.h
  function class (line 28) | class SpinnerLabel : public QLabel

FILE: lib/unicorn/widgets/StackedWidget.cpp
  function QSize (line 29) | QSize

FILE: lib/unicorn/widgets/StackedWidget.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/widgets/StatusLight.h
  function setColor (line 37) | void setColor( const QColor& c ) { m_color = c; }

FILE: lib/unicorn/widgets/TagListWidget.cpp
  class TallerRowDelegate (line 44) | class TallerRowDelegate : public QItemDelegate
    method QSize (line 46) | virtual QSize sizeHint ( const QStyleOptionViewItem & option, const QM...
  function QTreeWidgetItem (line 80) | QTreeWidgetItem*
  function QMimeData (line 162) | QMimeData*

FILE: lib/unicorn/widgets/TagListWidget.h
  function class (line 27) | class TagListWidget : public QTreeWidget
  function class (line 66) | class TagIconView : public TagListWidget

FILE: lib/unicorn/widgets/TrackWidget.h
  type Type (line 33) | enum Type

FILE: lib/unicorn/widgets/UnicornTabWidget.cpp
  function QSize (line 74) | QSize
  function QWidget (line 290) | QWidget*

FILE: lib/unicorn/widgets/UnicornTabWidget.h
  function namespace (line 28) | namespace unicorn

FILE: lib/unicorn/widgets/UserComboSelector.h
  function onSessionChanged (line 63) | void onSessionChanged( unicorn::Session& s )
  function onActivated (line 69) | void onActivated( int index )
  function refresh (line 85) | void refresh()

FILE: lib/unicorn/widgets/UserManagerWidget.cpp
  function QString (line 141) | const QString
  function foreach (line 176) | foreach( lastfm::User u, roster )
  function foreach (line 238) | foreach ( UserRadioButton* b, findChildren<UserRadioButton*>() )
  function UserRadioButton (line 356) | UserRadioButton*

FILE: lib/unicorn/widgets/UserManagerWidget.h
  function namespace (line 30) | namespace lastfm{ class User; }
  function namespace (line 31) | namespace unicorn
  function QString (line 54) | const QString user() const;

FILE: lib/unicorn/widgets/UserMenu.cpp
  function foreach (line 99) | foreach( User u, unicorn::Settings().userRoster() )

FILE: lib/unicorn/widgets/UserToolButton.h
  function namespace (line 28) | namespace lastfm { class User; }
  function namespace (line 29) | namespace unicorn { class Session; }

FILE: plugins/foobar08/audioscrobbler.cpp
  class play_callback_jump (line 33) | class play_callback_jump : public play_callback {
    method on_playback_starting (line 34) | virtual void on_playback_starting() {}
    method on_playback_new_track (line 35) | virtual void on_playback_new_track(metadb_handle * track) {
    method on_playback_stop (line 50) | virtual void on_playback_stop(play_control::stop_reason reason) {
    method on_playback_pause (line 57) | virtual void on_playback_pause(int state) {
    method on_playback_seek (line 68) | virtual void on_playback_seek(double time) {}
    method on_playback_edited (line 69) | virtual void on_playback_edited(metadb_handle * track) {}
    method on_playback_dynamic_info (line 70) | virtual void on_playback_dynamic_info(const file_info * info,bool b_tr...
  class initquit_audioscrobbler (line 73) | class initquit_audioscrobbler : public initquit {
    method on_init (line 75) | void on_init() 	{
    method on_quit (line 84) | void on_quit() 	{

FILE: plugins/foobar09/audioscrobbler.cpp
  class play_callback_jump (line 33) | class play_callback_jump : public play_callback_static
    method get_flags (line 36) | virtual unsigned int get_flags()
    method on_playback_starting (line 41) | virtual void on_playback_starting(play_control::t_track_command p_comm...
    method on_playback_new_track (line 43) | virtual void on_playback_new_track(metadb_handle_ptr track)
    method on_playback_stop (line 71) | virtual void on_playback_stop(play_control::t_stop_reason reason)
    method on_playback_pause (line 79) | virtual void on_playback_pause(bool state)
    method on_playback_seek (line 88) | virtual void on_playback_seek(double time) {}
    method on_playback_edited (line 89) | virtual void on_playback_edited(metadb_handle_ptr p_track) {}
    method on_playback_dynamic_info (line 90) | virtual void on_playback_dynamic_info(const file_info & info) {}
    method on_playback_dynamic_info_track (line 91) | virtual void on_playback_dynamic_info_track(const file_info & info) {}
    method on_playback_time (line 92) | virtual void on_playback_time(double p_time) {}
  function statusCallback (line 96) | void statusCallback (int reqId, bool error, std::string msg, void* userD...
  class initquit_audioscrobbler (line 104) | class initquit_audioscrobbler : public initquit {
    method on_init (line 107) | void on_init()
    method on_quit (line 113) | void on_quit()

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/abort_callback.h
  function namespace (line 4) | namespace foobar2000_io {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/advconfig.h
  function class (line 4) | class advconfig_entry : public service_base {
  function class (line 18) | class advconfig_branch : public advconfig_entry {
  function class (line 23) | class advconfig_entry_checkbox : public advconfig_entry {
  function class (line 32) | class advconfig_entry_string : public advconfig_entry {
  function class (line 47) | class advconfig_branch_impl : public advconfig_branch {
  function GUID (line 51) | GUID get_guid() {return m_guid;}
  function GUID (line 52) | GUID get_parent() {return m_parent;}
  function reset (line 53) | void reset() {}
  function get_sort_priority (line 54) | double get_sort_priority() {return m_priority;}
  function GUID (line 68) | GUID get_guid() {return m_state.get_guid();}
  function GUID (line 69) | GUID get_parent() {return m_parent;}
  function reset (line 70) | void reset() {m_state = m_initialstate;}
  function get_state (line 71) | bool get_state() {return m_state;}
  function set_state (line 72) | void set_state(bool p_state) {m_state = p_state;}
  function is_radio (line 73) | bool is_radio() {return p_is_radio;}
  function get_sort_priority (line 74) | double get_sort_priority() {return m_priority;}
  type advconfig_checkbox_factory_t (line 96) | typedef advconfig_checkbox_factory_t<false> advconfig_checkbox_factory;
  type advconfig_checkbox_factory_t (line 97) | typedef advconfig_checkbox_factory_t<true> advconfig_radio_factory;
  function class (line 99) | class advconfig_entry_string_impl : public advconfig_entry_string {
  function GUID (line 104) | GUID get_guid() {return m_state.get_guid();}
  function GUID (line 105) | GUID get_parent() {return m_parent;}
  function reset (line 106) | void reset() {core_api::ensure_main_thread();m_state = m_initialstate;}
  function get_sort_priority (line 107) | double get_sort_priority() {return m_priority;}
  function get_state (line 108) | void get_state(pfc::string_base & p_out) {core_api::ensure_main_thread()...
  function set_state (line 109) | void set_state(const char * p_string,t_size p_length = infinite) {core_a...
  function t_uint32 (line 110) | t_uint32 get_flags() {return 0;}
  function class (line 118) | class advconfig_string_factory : public service_factory_single_t<advconf...
  function class (line 154) | class advconfig_entry_enum : public advconfig_entry {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/audio_chunk.cpp
  function check_exclusive (line 16) | static bool check_exclusive(unsigned val, unsigned mask)
  class msvc6_sucks_v2 (line 23) | class msvc6_sucks_v2 { public:
    method do_fixedpoint_convert (line 24) | inline static void do_fixedpoint_convert(const void * source,unsigned ...
  class msvc6_sucks (line 70) | class msvc6_sucks { public:
    method do_fixedpoint_convert (line 71) | inline static void do_fixedpoint_convert(bool b_swap,bool b_signed,con...
  function process_float_multi (line 153) | static void process_float_multi(audio_sample * p_out,const t_float * p_i...
  function process_float_multi_swap (line 161) | static void process_float_multi_swap(audio_sample * p_out,const t_float ...
  function t_size (line 260) | t_size audio_chunk::skip_first_samples(t_size samples_delta)
  function audio_sample (line 281) | audio_sample audio_chunk::get_peak(audio_sample peak) const

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/audio_chunk.h
  function class (line 5) | class NOVTABLE audio_chunk {
  function virtual (line 202) | virtual audio_sample * get_data() {return m_data.get_ptr();}
  function virtual (line 203) | virtual const audio_sample * get_data() const {return m_data.get_ptr();}
  function virtual (line 205) | virtual void set_data_size(t_size new_size) {m_data.set_size(new_size);}
  function virtual (line 208) | virtual void set_srate(unsigned val) {m_srate=val;}
  function virtual (line 211) | virtual void set_channels(unsigned val,unsigned setup) {m_nch = val;m_se...
  function set_channels (line 212) | void set_channels(unsigned val) {set_channels(val,g_guess_channel_config...
  function virtual (line 215) | virtual void set_sample_count(t_size val) {m_samples = val;}
  type audio_chunk_impl_t (line 221) | typedef audio_chunk_impl_t<> audio_chunk_impl;
  type audio_chunk_impl (line 222) | typedef audio_chunk_impl audio_chunk_i;
  function class (line 225) | class audio_chunk_temp_impl : public audio_chunk {
  function audio_sample (line 233) | audio_sample * get_data() {throw pfc::exception_not_implemented();}
  function audio_sample (line 234) | const audio_sample * get_data() const {return m_data;}
  function set_data_size (line 236) | void set_data_size(t_size p_new_size) {throw pfc::exception_not_implemen...
  function set_srate (line 239) | void set_srate(unsigned val) {throw pfc::exception_not_implemented();}
  function set_channels (line 242) | void set_channels(unsigned p_count,unsigned p_config) {throw pfc::except...
  function set_sample_count (line 246) | void set_sample_count(t_size val) {throw pfc::exception_not_implemented();}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/audio_chunk_channel_config.cpp
  function DWORD (line 51) | DWORD audio_chunk::g_channel_config_to_wfx(unsigned p_config)

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/cfg_var.cpp
  function cfg_var_guid_compare (line 8) | static int cfg_var_guid_compare(const cfg_var * p_var1,const cfg_var * p...
  function cfg_var_guid_compare_search (line 13) | static int cfg_var_guid_compare_search(const cfg_var * p_var1,const GUID...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/cfg_var.h
  function class (line 6) | class NOVTABLE cfg_var {
  function set_data_raw (line 44) | void set_data_raw(stream_reader * p_stream,t_size p_sizehint,abort_callb...
  type cfg_int_t (line 63) | typedef cfg_int_t<t_int32> cfg_int;
  type cfg_int_t (line 64) | typedef cfg_int_t<t_uint32> cfg_uint;
  type cfg_int_t (line 66) | typedef cfg_int_t<GUID> cfg_guid;
  type cfg_int_t (line 67) | typedef cfg_int_t<bool> cfg_bool;
  function set_data_raw (line 98) | void set_data_raw(stream_reader * p_stream,t_size p_sizehint,abort_callb...
  function cfg_var (line 107) | inline cfg_struct_t(const GUID & p_guid,int filler) : cfg_var(p_guid) {m...
  function t_struct (line 113) | inline t_struct& get_value() {return m_val;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/chapterizer.h
  function class (line 2) | class NOVTABLE chapter_list
  function class (line 30) | class chapter_list_impl : public chapter_list
  function file_info (line 41) | const file_info & get_info(t_size p_chapter) const {return m_infos[p_cha...
  function set_chapter_count (line 43) | void set_chapter_count(t_size p_count) {m_infos.set_size(p_count);}
  function set_info (line 44) | void set_info(t_size p_chapter,const file_info & p_info) {m_infos[p_chap...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/commandline.h
  type result (line 9) | enum result
  function virtual (line 16) | virtual void on_file(const char * url) {}
  function virtual (line 17) | virtual void on_files_done() {}
  function virtual (line 18) | virtual bool want_directories() {return false;}
  function class (line 23) | class commandline_handler_metadb_handle : public commandline_handler//he...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/completion_notify.cpp
  class main_thread_callback_myimpl (line 4) | class main_thread_callback_myimpl : public main_thread_callback {
    method callback_run (line 6) | void callback_run() {
    method main_thread_callback_myimpl (line 10) | main_thread_callback_myimpl(completion_notify_ptr p_notify,unsigned p_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/completion_notify.h
  function class (line 2) | class completion_notify : public service_base {
  function class (line 19) | class completion_notify_orphanable : public completion_notify {
  function setup (line 34) | void setup(t_receiver * p_receiver, unsigned p_task_id) {m_receiver = p_...
  function orphan (line 35) | void orphan() {m_receiver = NULL; m_taskid = 0;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/component.h
  function class (line 6) | class NOVTABLE foobar2000_client
  function class (line 25) | class NOVTABLE foobar2000_api

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/componentversion.h
  function virtual (line 21) | virtual void get_component_name(pfc::string_base & out) {out.set_string(...
  function virtual (line 22) | virtual void get_component_version(pfc::string_base & out) {out.set_stri...
  function virtual (line 23) | virtual void get_about_message(pfc::string_base & out) {out.set_string(a...
  function virtual (line 33) | virtual void get_component_name(pfc::string_base & out) {out.set_string(...
  function virtual (line 34) | virtual void get_component_version(pfc::string_base & out) {out.set_stri...
  function virtual (line 35) | virtual void get_about_message(pfc::string_base & out) {out.set_string(a...
  type service_factory_single_transparent_t (line 40) | typedef service_factory_single_transparent_t<componentversion_impl_copy>...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/config_object.cpp
  function t_int32 (line 66) | t_int32 config_object::get_data_int32_simple(t_int32 p_default) {
  function t_int32 (line 93) | t_int32 config_object::g_get_data_int32_simple(const GUID & p_guid,t_int...
  class stream_writer_string (line 107) | class stream_writer_string : public stream_writer {
    method write (line 109) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abo...
    method stream_writer_string (line 112) | stream_writer_string(pfc::string_base & p_out) : m_out(p_out) {m_out.r...
  class stream_writer_fixedbuffer (line 117) | class stream_writer_fixedbuffer : public stream_writer {
    method write (line 119) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abo...
    method stream_writer_fixedbuffer (line 126) | stream_writer_fixedbuffer(void * p_out,t_size p_bytes,t_size & p_bytes...
  class stream_writer_get_length (line 135) | class stream_writer_get_length : public stream_writer {
    method write (line 137) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abo...
    method stream_writer_get_length (line 140) | stream_writer_get_length(t_size & p_length) : m_length(p_length) {m_le...
  function t_size (line 146) | t_size config_object::get_data_raw(void * p_out,t_size p_bytes) {
  function t_size (line 152) | t_size config_object::get_data_raw_length() {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/config_object.h
  function class (line 60) | class standard_config_objects
  function class (line 75) | class config_object_notify : public service_base

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/config_object_impl.h
  function set_data_raw (line 43) | void set_data_raw(stream_reader * p_stream,t_size p_sizehint,abort_callb...
  type service_factory_single_transparent_t (line 49) | typedef service_factory_single_transparent_t<config_object_impl> config_...
  function get_data (line 57) | void get_data(stream_writer * p_stream,abort_callback & p_abort) const {
  function set_data (line 62) | void set_data(stream_reader * p_stream,abort_callback & p_abort,bool p_n...
  function cfg_var (line 76) | cfg_var(p_guid)
  function set_data_raw (line 84) | void set_data_raw(stream_reader * p_stream,t_size p_sizehint,abort_callb...
  function class (line 104) | class config_object_string_factory : public config_object_factory
  function class (line 112) | class config_object_bool_factory : public config_object_fixed_factory_t<1>
  function m_initval (line 127) | t_initval(T p_initval) : m_initval(p_initval) {byte_order::order_native_...
  function T (line 128) | T * get_ptr() {return &m_initval;}
  type config_object_int_factory_t (line 136) | typedef config_object_int_factory_t<t_int32> config_object_int32_factory;
  function class (line 140) | class config_object_notify_impl_simple : public config_object_notify
  type service_factory_single_transparent_t (line 155) | typedef service_factory_single_transparent_t<config_object_notify_impl_s...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/console.h
  function namespace (line 5) | namespace console

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/contextmenu.h
  function class (line 7) | class NOVTABLE contextmenu_item_node {
  function t_size (line 45) | t_size get_children_count() {return 0;}
  function contextmenu_item_node (line 46) | contextmenu_item_node * get_child(t_size) {return NULL;}
  function t_size (line 53) | t_size get_children_count() {return 0;}
  function contextmenu_item_node (line 54) | contextmenu_item_node * get_child(t_size) {return NULL;}
  function execute (line 61) | void execute(const pfc::list_base_const_t<metadb_handle_ptr> & data,cons...
  function get_description (line 62) | bool get_description(pfc::string_base & p_out) {return false;}
  function execute (line 69) | void execute(const pfc::list_base_const_t<metadb_handle_ptr> & data,cons...
  function get_description (line 70) | bool get_description(pfc::string_base & p_out) {return false;}
  function class (line 73) | class contextmenu_item_node_separator : public contextmenu_item_node
  type t_enabled_state (line 96) | enum t_enabled_state {
  function get_display_data (line 130) | bool get_display_data(pfc::string_base & p_out,unsigned & p_displayflags...
  function execute (line 131) | void execute(const pfc::list_base_const_t<metadb_handle_ptr> & p_data,co...
  function get_description (line 132) | bool get_description(pfc::string_base & p_out) {return m_owner->get_item...
  function GUID (line 133) | GUID get_guid() {return pfc::guid_null;}
  function is_mappable_shortcut (line 134) | bool is_mappable_shortcut() {return m_owner->item_is_mappable_shortcut(m...
  function contextmenu_item_node_root (line 140) | contextmenu_item_node_root * instantiate_item(unsigned p_index,const pfc...
  function item_execute_simple (line 146) | void item_execute_simple(unsigned p_index,const GUID & p_node,const pfc:...
  function virtual (line 152) | virtual bool item_is_mappable_shortcut(unsigned p_index)
  function virtual (line 158) | virtual bool get_display_data(unsigned n,const pfc::list_base_const_t<me...
  type t_flags (line 170) | enum t_flags
  function virtual (line 179) | virtual t_enabled_state get_enabled_state(unsigned p_index) {return cont...
  function virtual (line 184) | virtual bool context_get_display(unsigned p_index,const pfc::list_base_c...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/contextmenu_manager.h
  type shortcut_type (line 10) | enum shortcut_type
  function class (line 50) | class NOVTABLE contextmenu_node {
  function g_create (line 85) | static void g_create(service_ptr_t<contextmenu_manager> & p_out) {p_out ...
  function win32_build_menu (line 92) | void win32_build_menu(HMENU menu,int base_id,int max_id) {win32_build_me...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/core_api.h
  function namespace (line 4) | namespace core_api {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/coreversion.h
  type t_core_version_data (line 11) | struct t_core_version_data {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/dsp.cpp
  function t_size (line 4) | t_size dsp_chunk_list_impl::get_count() const {return m_data.get_count();}
  function audio_chunk (line 6) | audio_chunk * dsp_chunk_list_impl::get_item(t_size n) const {return n>=0...
  function audio_chunk (line 23) | audio_chunk * dsp_chunk_list_impl::insert_item(t_size idx,t_size hint_size)
  function t_size (line 189) | t_size dsp_chain_config_impl::get_count() const
  function dsp_preset (line 194) | const dsp_preset & dsp_chain_config_impl::get_item(t_size p_index) const
  class dsp_preset_edit_callback_impl (line 378) | class dsp_preset_edit_callback_impl : public dsp_preset_edit_callback {
    method dsp_preset_edit_callback_impl (line 380) | dsp_preset_edit_callback_impl(dsp_preset & p_data) : m_data(p_data) {}
    method on_preset_changed (line 381) | void on_preset_changed(const dsp_preset & p_data) {m_data = p_data;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/dsp.h
  function class (line 1) | class NOVTABLE dsp_chunk_list {
  function remove_all (line 11) | void remove_all() {remove_mask(bit_array_true());}
  function get_duration (line 13) | double get_duration() {
  function add_chunk (line 20) | void add_chunk(const audio_chunk * chunk) {
  function class (line 31) | class dsp_chunk_list_impl : public dsp_chunk_list//implementation
  type dsp_impl_base_t (line 172) | typedef dsp_impl_base_t<dsp_v2> dsp_impl_base;
  function class (line 174) | class NOVTABLE dsp_preset {
  function class (line 205) | class dsp_preset_writer : public stream_writer {
  function class (line 219) | class dsp_preset_reader : public stream_reader {
  function class (line 240) | class dsp_preset_impl : public dsp_preset
  function set_owner (line 251) | void set_owner(const GUID & p_owner) {m_owner = p_owner;}
  function set_data (line 254) | void set_data(const void * p_data,t_size p_data_size) {m_data.set_data_f...
  function class (line 261) | class NOVTABLE dsp_preset_edit_callback {
  function get_default_preset (line 311) | bool get_default_preset(dsp_preset & p_out)
  function instantiate (line 317) | bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset)
  function GUID (line 326) | GUID get_guid() {return T::g_get_guid();}
  function have_config_popup (line 328) | bool have_config_popup() {return false;}
  function show_config_popup (line 329) | bool show_config_popup(dsp_preset & p_data,HWND p_parent) {return false;}
  function get_default_preset (line 336) | bool get_default_preset(dsp_preset & p_out) {return T::g_get_default_pre...
  function instantiate (line 337) | bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset) {
  function GUID (line 344) | GUID get_guid() {return T::g_get_guid();}
  function have_config_popup (line 346) | bool have_config_popup() {return T::g_have_config_popup();}
  function show_config_popup (line 347) | bool show_config_popup(dsp_preset & p_data,HWND p_parent) {return T::g_s...
  function get_default_preset (line 355) | bool get_default_preset(dsp_preset & p_out) {return T::g_get_default_pre...
  function instantiate (line 356) | bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset) {
  function GUID (line 363) | GUID get_guid() {return T::g_get_guid();}
  function have_config_popup (line 365) | bool have_config_popup() {return T::g_have_config_popup();}
  function show_config_popup_v2 (line 367) | void show_config_popup_v2(const dsp_preset & p_data,HWND p_parent,dsp_pr...
  function class (line 377) | class NOVTABLE dsp_chain_config
  function class (line 401) | class dsp_chain_config_impl : public dsp_chain_config
  function t_size (line 407) | t_size get_count() const;
  function class (line 421) | class cfg_dsp_chain_config : public cfg_var {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/dsp_manager.h
  type t_dsp_chain_entry (line 1) | struct t_dsp_chain_entry {
  type pfc (line 6) | typedef pfc::chain_list_t<t_dsp_chain_entry> t_dsp_chain;
  function class (line 8) | class dsp_manager {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_info.cpp
  function t_size (line 3) | t_size file_info::meta_find_ex(const char * p_name,t_size p_name_length)...
  function t_size (line 40) | t_size file_info::meta_get_count_by_name_ex(const char * p_name,t_size p...
  function t_size (line 47) | t_size file_info::info_find_ex(const char * p_name,t_size p_name_length)...
  function t_int64 (line 181) | t_int64 file_info::info_get_int(const char * name) const
  function t_int64 (line 189) | t_int64 file_info::info_get_length_samples() const
  function is_valid_bps (line 260) | static bool is_valid_bps(t_int64 val)
  function t_size (line 302) | t_size file_info::meta_add_ex(const char * p_name,t_size p_name_length,c...
  function t_size (line 319) | t_size file_info::meta_calc_total_value_count() const
  function is_valid_field_name_char (line 437) | static bool is_valid_field_name_char(char p_char) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_info.h
  function format_track_gain (line 5) | struct replaygain_info
  function format_album_peak (line 20) | inline bool format_album_peak(char p_buffer[text_buffer_size]) const {re...
  function format_track_peak (line 21) | inline bool format_track_peak(char p_buffer[text_buffer_size]) const {re...
  function set_from_meta (line 30) | inline bool set_from_meta(const char * p_name,const char * p_value) {ret...
  function remove_album_gain (line 37) | inline void remove_album_gain() {m_album_gain = gain_invalid;}
  function remove_track_gain (line 38) | inline void remove_track_gain() {m_track_gain = gain_invalid;}
  function remove_album_peak (line 39) | inline void remove_album_peak() {m_album_peak = peak_invalid;}
  function remove_track_peak (line 40) | inline void remove_track_peak() {m_track_peak = peak_invalid;}
  function class (line 58) | class NOVTABLE file_info {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_info_impl.cpp
  function t_size (line 4) | t_size file_info_impl::meta_get_count() const
  function t_size (line 14) | t_size file_info_impl::meta_enum_value_count(t_size p_index) const
  function t_size (line 24) | t_size file_info_impl::meta_set_ex(const char * p_name,t_size p_name_len...
  function t_size (line 30) | t_size file_info_impl::meta_set_nocheck_ex(const char * p_name,t_size p_...
  function t_size (line 57) | t_size file_info_impl::info_get_count() const
  function t_size (line 72) | t_size file_info_impl::info_set_ex(const char * p_name,t_size p_name_len...
  function t_size (line 78) | t_size file_info_impl::info_set_nocheck_ex(const char * p_name,t_size p_...
  function file_info_impl (line 99) | const file_info_impl & file_info_impl::operator=(const file_info_impl & ...
  function replaygain_info (line 125) | replaygain_info file_info_impl::get_replaygain() const
  function t_size (line 142) | t_size file_info_impl_utils::info_storage::add_item(const char * p_name,...
  function t_size (line 155) | t_size file_info_impl_utils::meta_storage::add_entry(const char * p_name...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_info_impl.h
  function namespace (line 4) | namespace file_info_impl_utils {
  type pfc (line 18) | typedef pfc::array_t<info_entry,pfc::alloc_fast> info_entry_array;
  function namespace (line 22) | namespace pfc {
  function namespace (line 27) | namespace file_info_impl_utils {
  function namespace (line 43) | namespace file_info_impl_utils {
  type pfc (line 61) | typedef pfc::array_hybrid_t<meta_entry,10, pfc::alloc_fast> meta_entry_a...
  function namespace (line 63) | namespace pfc {
  function namespace (line 68) | namespace file_info_impl_utils {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_info_merge.cpp
  function t_size (line 3) | static t_size merge_tags_calc_rating_by_index(const file_info & p_info,t...
  function t_size (line 11) | static t_size merge_tags_calc_rating(const file_info & p_info,const char...
  function merge_tags_copy_info (line 21) | static void merge_tags_copy_info(const char * field,const file_info * fr...
  type meta_merge_entry (line 28) | struct meta_merge_entry {
    method meta_merge_entry (line 29) | meta_merge_entry() : m_rating(0) {}
  class meta_merge_map_enumerator (line 34) | class meta_merge_map_enumerator {
    method meta_merge_map_enumerator (line 36) | meta_merge_map_enumerator(file_info & p_out) : m_out(p_out) {
  function merge_meta (line 52) | static void merge_meta(file_info & p_out,const pfc::list_base_const_t<co...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_operation_callback.cpp
  function g_on_files_deleted_sorted (line 4) | static void g_on_files_deleted_sorted(const pfc::list_base_const_t<const...
  function g_on_files_moved_sorted (line 17) | static void g_on_files_moved_sorted(const pfc::list_base_const_t<const c...
  function g_on_files_copied_sorted (line 30) | static void g_on_files_copied_sorted(const pfc::list_base_const_t<const ...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/file_operation_callback.h
  function class (line 6) | class file_operation_callback : public service_base

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/filesystem.cpp
  function t_filesize (line 34) | t_filesize file::g_transfer(stream_reader * p_src,stream_writer * p_dst,...
  function path_pack_string (line 218) | static void path_pack_string(pfc::string_base & out,const char * src)
  function path_unpack_string (line 227) | static int path_unpack_string(pfc::string8 & out,const char * src)
  function FILE (line 422) | FILE * filesystem::streamio_open(const char * path,const char * flags)
  class directory_callback_isempty (line 437) | class directory_callback_isempty : public directory_callback
    method directory_callback_isempty (line 441) | directory_callback_isempty() : m_isempty(true) {}
    method on_entry (line 442) | bool on_entry(filesystem * owner,abort_callback & p_abort,const char *...
    method isempty (line 447) | bool isempty() {return m_isempty;}
  class directory_callback_dummy (line 450) | class directory_callback_dummy : public directory_callback
    method on_entry (line 453) | bool on_entry(filesystem * owner,abort_callback & p_abort,const char *...
  class directory_callback_impl_copy (line 489) | class directory_callback_impl_copy : public directory_callback
    method directory_callback_impl_copy (line 492) | directory_callback_impl_copy(const char * p_target)
    method on_entry (line 498) | bool on_entry(filesystem * owner,abort_callback & p_abort,const char *...
  function t_filestats (line 548) | t_filestats file::get_stats(abort_callback & p_abort)
  function t_filesize (line 556) | t_filesize stream_reader::skip(t_filesize p_bytes,abort_callback & p_abort)
  function t_filetimestamp (line 632) | t_filetimestamp foobar2000_io::filetimestamp_from_system_timer()
  class exception_io_win32_ex (line 706) | class exception_io_win32_ex : public exception_io_win32 {
    method exception_io_win32_ex (line 708) | exception_io_win32_ex(DWORD p_code) : m_msg(pfc::string_formatter() <<...
    method exception_io_win32_ex (line 709) | exception_io_win32_ex(const exception_io_win32_ex & p_other) {*this = ...
  function t_filesize (line 760) | t_filesize file::get_size_ex(abort_callback & p_abort) {
  function t_filesize (line 778) | t_filesize file::get_remaining(abort_callback & p_abort) {
  function t_filesize (line 786) | t_filesize file::g_transfer(service_ptr_t<file> p_src,service_ptr_t<file...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/filesystem.h
  function namespace (line 9) | namespace foobar2000_io
  function class (line 81) | class NOVTABLE stream_reader {
  function class (line 132) | class NOVTABLE stream_writer {
  function virtual (line 216) | virtual bool is_in_memory() {return false;}
  function set_eof (line 244) | void set_eof(abort_callback & p_abort) {resize(get_position(p_abort),p_a...
  function class (line 276) | class file_dynamicinfo : public file {
  function write (line 292) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort...
  type file_readonly_t (line 294) | typedef file_readonly_t<file> file_readonly;
  function class (line 298) | class NOVTABLE directory_callback {
  type t_open_mode (line 311) | enum t_open_mode {
  function virtual (line 333) | virtual bool relative_path_create(const char * file_path,const char * pl...
  function virtual (line 334) | virtual bool relative_path_parse(const char * relative_path,const char *...
  function g_open_read (line 358) | static void g_open_read(service_ptr_t<file> & p_out,const char * path,ab...
  function class (line 394) | class directory_callback_impl : public directory_callback
  function class (line 476) | class format_filetimestamp {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/filesystem_helper.cpp
  function t_size (line 35) | t_size stream_reader_chunk::read(void * p_buffer,t_size p_bytes,abort_ca...
  function t_size (line 89) | t_size reader_membuffer_base::read(void * p_buffer,t_size p_bytes,abort_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/filesystem_helper.h
  function class (line 5) | class file_path_canonical {
  function class (line 15) | class file_path_display {
  function write (line 32) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort...
  function t_filesize (line 34) | t_filesize get_size(abort_callback & p_abort) {return get_buffer_size();}
  function t_filesize (line 35) | t_filesize get_position(abort_callback & p_abort) {return m_offset;}
  function reopen (line 37) | void reopen(abort_callback & p_abort) {seek(0,p_abort);}
  function can_seek (line 39) | bool can_seek() {return true;}
  function is_in_memory (line 40) | bool is_in_memory() {return true;}
  function virtual (line 46) | virtual bool get_content_type(pfc::string_base &) {return false;}
  function seek_internal (line 47) | inline void seek_internal(t_size p_offset) {if (p_offset > get_buffer_si...
  function class (line 52) | class reader_membuffer_mirror : public reader_membuffer_base
  function class (line 94) | class reader_limited : public file_readonly {
  function class (line 141) | class stream_reader_memblock_ref : public stream_reader
  function write (line 166) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
  function class (line 177) | class stream_reader_limited_ref : public stream_reader
  function class (line 202) | class stream_writer_chunk_dwordheader : public stream_writer
  function class (line 232) | class stream_writer_chunk : public stream_writer
  function class (line 247) | class stream_reader_chunk : public stream_reader

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/genrand.h
  function service_ptr_t (line 13) | static service_ptr_t<genrand_service> g_create() {return standard_api_cr...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/hasher_md5.cpp
  function GUID (line 3) | GUID hasher_md5::guid_from_result(const hasher_md5_result & param)
  function hasher_md5_result (line 11) | hasher_md5_result hasher_md5::process_single(const void * p_buffer,t_siz...
  function GUID (line 19) | GUID hasher_md5::process_single_guid(const void * p_buffer,t_size p_bytes)

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/hasher_md5.h
  type hasher_md5_state (line 1) | struct hasher_md5_state {
  type hasher_md5_result (line 5) | struct hasher_md5_result {
  function namespace (line 12) | namespace pfc {
  function GUID (line 30) | GUID get_result_guid(const hasher_md5_state & p_state) {return guid_from...
  function process_string (line 34) | void process_string(hasher_md5_state & p_state,const char * p_string,t_s...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/initquit.h
  function virtual (line 11) | virtual void on_quit() {}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/input.cpp
  function prepare_for_open (line 37) | static void prepare_for_open(service_ptr_t<input_entry> & p_service,serv...
  function g_find_inputs_by_content_type (line 70) | bool g_find_inputs_by_content_type(pfc::list_base_t<service_ptr_t<input_...
  function g_find_inputs_by_path (line 82) | bool g_find_inputs_by_path(pfc::list_base_t<service_ptr_t<input_entry> >...
  function g_open_from_list (line 95) | void g_open_from_list(service_ptr_t<t_service> & p_instance,pfc::list_ba...
  function needs_write_access (line 123) | bool needs_write_access() {return false;}
  function g_open_t (line 126) | void g_open_t(service_ptr_t<t_service> & p_instance,service_ptr_t<file> ...
  function input_open_file_helper (line 228) | void input_open_file_helper(service_ptr_t<file> & p_file,const char * p_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/input.h
  function class (line 15) | class input_info_reader : public service_base
  function class (line 42) | class input_decoder : public input_info_reader
  function class (line 95) | class input_info_writer : public input_info_reader
  function class (line 111) | class input_entry : public service_base

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/input_file_type.h
  function class (line 1) | class input_file_type : public service_base
  function class (line 14) | class input_file_type_impl : public service_impl_single_t<input_file_type>
  function get_name (line 21) | bool get_name(unsigned idx,pfc::string_base & out) {if (idx==0) {out = n...
  function get_mask (line 22) | bool get_mask(unsigned idx,pfc::string_base & out) {if (idx==0) {out = m...
  function is_associatable (line 23) | bool is_associatable(unsigned idx) {return m_associatable;}
  function class (line 34) | class input_file_type_factory : private service_factory_single_transpare...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/input_impl.h
  type t_input_open_reason (line 1) | enum t_input_open_reason {
  function class (line 16) | class input_impl
  function class (line 70) | class input_singletrack_impl
  function class (line 121) | class input_singletrack_file_impl
  function t_uint32 (line 158) | t_uint32 get_subsong_count() {
  function t_uint32 (line 162) | t_uint32 get_subsong(t_uint32 p_index) {
  function get_info (line 167) | void get_info(t_uint32 p_subsong,file_info & p_info,abort_callback & p_a...
  function t_filestats (line 171) | t_filestats get_file_stats(abort_callback & p_abort) {
  function initialize (line 177) | void initialize(t_uint32 p_subsong,unsigned p_flags,abort_callback & p_a...
  function run (line 181) | bool run(audio_chunk & p_chunk,abort_callback & p_abort) {
  function seek (line 185) | void seek(double p_seconds,abort_callback & p_abort) {
  function can_seek (line 189) | bool can_seek() {
  function get_dynamic_info (line 193) | bool get_dynamic_info(file_info & p_out, double & p_timestamp_delta) {
  function get_dynamic_info_track (line 197) | bool get_dynamic_info_track(file_info & p_out, double & p_timestamp_delt...
  function on_idle (line 201) | void on_idle(abort_callback & p_abort) {
  function set_info (line 207) | void set_info(t_uint32 p_subsong,const file_info & p_info,abort_callback...
  function commit (line 211) | void commit(abort_callback & p_abort) {
  function open (line 226) | void open(service_ptr_t<file> p_filehint,const char * p_path,t_input_ope...
  function get_info (line 230) | void get_info(t_uint32 p_subsong,file_info & p_info,abort_callback & p_a...
  function t_uint32 (line 235) | t_uint32 get_subsong_count() {
  function t_uint32 (line 239) | t_uint32 get_subsong(t_uint32 p_index) {
  function t_filestats (line 244) | t_filestats get_file_stats(abort_callback & p_abort) {
  function decode_initialize (line 248) | void decode_initialize(t_uint32 p_subsong,unsigned p_flags,abort_callbac...
  function decode_run (line 253) | bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort) {return ...
  function decode_seek (line 254) | void decode_seek(double p_seconds,abort_callback & p_abort) {m_instance....
  function decode_can_seek (line 255) | bool decode_can_seek() {return m_instance.decode_can_seek();}
  function decode_get_dynamic_info (line 256) | bool decode_get_dynamic_info(file_info & p_out, double & p_timestamp_del...
  function decode_get_dynamic_info_track (line 257) | bool decode_get_dynamic_info_track(file_info & p_out, double & p_timesta...
  function decode_on_idle (line 258) | void decode_on_idle(abort_callback & p_abort) {m_instance.decode_on_idle...
  function retag_set_info (line 260) | void retag_set_info(t_uint32 p_subsong,const file_info & p_info,abort_ca...
  function retag_commit (line 265) | void retag_commit(abort_callback & p_abort) {}
  function g_is_our_content_type (line 267) | static bool g_is_our_content_type(const char * p_content_type) {return I...
  function g_is_our_path (line 268) | static bool g_is_our_path(const char * p_path,const char * p_extension) ...
  function is_our_path (line 291) | bool is_our_path(const char * p_full_path,const char * p_extension) {ret...
  function open_for_decoding (line 293) | void open_for_decoding(service_ptr_t<input_decoder> & p_instance,service...
  function open_for_info_read (line 297) | void open_for_info_read(service_ptr_t<input_info_reader> & p_instance,se...
  function open_for_info_write (line 301) | void open_for_info_write(service_ptr_t<input_info_writer> & p_instance,s...
  function get_extended_data (line 305) | void get_extended_data(service_ptr_t<file> p_filehint,const playable_loc...
  function get_flags (line 309) | unsigned get_flags() {return t_flags;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/mem_block_container.h
  function class (line 2) | class NOVTABLE mem_block_container {
  function set_size (line 30) | void set_size(t_size p_size) {
  type mem_block_container_impl_t (line 37) | typedef mem_block_container_impl_t<> mem_block_container_impl;
  function class (line 39) | class mem_block_container_temp_impl : public mem_block_container {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/menu.h
  function virtual (line 38) | virtual t_uint32 get_sort_priority() {return sort_priority_dontcare;}
  function virtual (line 40) | virtual bool get_display(t_uint32 p_index,pfc::string_base & p_text,t_ui...
  function class (line 73) | class mainmenu_groups {
  function class (line 92) | class mainmenu_group_impl : public mainmenu_group {
  function class (line 102) | class mainmenu_group_popup_impl : public mainmenu_group_popup {
  type service_factory_single_t (line 113) | typedef service_factory_single_t<mainmenu_group_impl> __mainmenu_group_f...
  type service_factory_single_t (line 114) | typedef service_factory_single_t<mainmenu_group_popup_impl> __mainmenu_g...
  function class (line 116) | class mainmenu_group_factory : public __mainmenu_group_factory {
  function class (line 121) | class mainmenu_group_popup_factory : public __mainmenu_group_popup_facto...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/menu_helpers.cpp
  function run_context_command_internal (line 23) | static bool run_context_command_internal(const GUID & p_command,const GU...
  function g_is_checked (line 77) | static bool g_is_checked(const GUID & p_command,const GUID & p_subcomman...
  function calc_total_action_count (line 180) | static unsigned calc_total_action_count()

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/menu_helpers.h
  function namespace (line 1) | namespace menu_helpers {
  function class (line 67) | class standard_commands

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/menu_item.cpp
  function contextmenu_item_node (line 14) | static contextmenu_item_node * g_find_node(const GUID & p_guid,contextme...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/menu_manager.cpp
  function fix_ampersand (line 5) | static void fix_ampersand(const char * src,pfc::string_base & out)
  function flags_to_win32 (line 24) | static unsigned flags_to_win32(unsigned flags)
  class mnemonic_manager (line 132) | class mnemonic_manager
    method is_used (line 135) | bool is_used(unsigned c)
    method is_alphanumeric (line 142) | static bool is_alphanumeric(char c)
    method insert (line 150) | void insert(const char * src,unsigned idx,pfc::string_base & out)
    method check_string (line 159) | bool check_string(const char * src)
    method process_string (line 177) | bool process_string(const char * src,pfc::string_base & out)//returns ...
  function test_key (line 253) | static bool test_key(unsigned k)
  function get_key_code (line 263) | static unsigned get_key_code(WPARAM wp)

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/message_loop.h
  function class (line 1) | class NOVTABLE message_filter
  function class (line 7) | class NOVTABLE idle_handler
  function class (line 25) | class message_filter_impl_base : public message_filter {
  function class (line 34) | class message_filter_impl_accel : public message_filter_impl_base {
  function set_wnd (line 50) | void set_wnd(HWND p_wnd) {m_wnd = p_wnd;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/metadb.cpp
  function t_size (line 106) | t_size file_info_update_helper::get_item_count() const
  function file_info (line 116) | file_info & file_info_update_helper::get_item(t_size p_index)
  function metadb_handle_ptr (line 121) | metadb_handle_ptr file_info_update_helper::get_item_handle(t_size p_inde...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/metadb.h
  type t_load_info_type (line 11) | enum t_load_info_type {
  type t_update_info_state (line 17) | enum t_update_info_state {
  type t_load_info_state (line 23) | enum t_load_info_state {
  type pfc (line 173) | typedef pfc::comparator_strcmp path_comparator;
  function path_compare_ex (line 175) | inline static int path_compare_ex(const char * p1,unsigned len1,const ch...
  function path_compare (line 176) | inline static int path_compare(const char * p1,const char * p2) {return ...
  function path_compare_metadb_handle (line 177) | inline static int path_compare_metadb_handle(const metadb_handle_ptr & p...
  function class (line 183) | class in_metadb_sync {
  function class (line 195) | class in_metadb_sync_fromptr {
  function class (line 203) | class in_metadb_sync_fromhandle {
  type t_write_result (line 221) | enum t_write_result
  function t_size (line 229) | t_size get_item_count() const;
  function class (line 271) | class file_info_filter_impl : public file_info_filter {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/metadb_handle.cpp
  function t_filetimestamp (line 14) | t_filetimestamp metadb_handle::get_filetimestamp()
  function t_filesize (line 19) | t_filesize metadb_handle::get_filesize()

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/metadb_handle.h
  type service_ptr_t (line 87) | typedef service_ptr_t<metadb_handle> metadb_handle_ptr;
  function namespace (line 89) | namespace metadb_handle_list_helper {
  type list_base_const_t (line 114) | typedef list_base_const_t<metadb_handle_ptr> t_interface;
  function sort_by_format_partial (line 117) | inline void sort_by_format_partial(t_size base,t_size count,const char *...
  function sort_by_format_get_order (line 118) | inline void sort_by_format_get_order(t_size* order,const char * spec,tit...
  function sort_by_format_get_order_partial (line 119) | inline void sort_by_format_get_order_partial(t_size base,t_size count,t_...
  function sort_by_format (line 121) | inline void sort_by_format(const service_ptr_t<titleformat_object> & p_s...
  function sort_by_format_partial (line 122) | inline void sort_by_format_partial(t_size base,t_size count,const servic...
  function sort_by_format_get_order (line 123) | inline void sort_by_format_get_order(t_size* order,const service_ptr_t<t...
  function sort_by_format_get_order_partial (line 124) | inline void sort_by_format_get_order_partial(t_size base,t_size count,t_...
  function sort_by_relative_path (line 126) | inline void sort_by_relative_path() {sort_by_relative_path_partial(0,get...
  function sort_by_relative_path_partial (line 127) | inline void sort_by_relative_path_partial(t_size base,t_size count) {met...
  function sort_by_relative_path_get_order (line 128) | inline void sort_by_relative_path_get_order(t_size* order) const {sort_b...
  function sort_by_relative_path_get_order_partial (line 129) | inline void sort_by_relative_path_get_order_partial(t_size base,t_size c...
  function remove_duplicates (line 131) | inline void remove_duplicates() {metadb_handle_list_helper::remove_dupli...
  function sort_by_pointer_remove_duplicates (line 132) | inline void sort_by_pointer_remove_duplicates() {metadb_handle_list_help...
  function sort_by_path_quick (line 133) | inline void sort_by_path_quick() {metadb_handle_list_helper::sort_by_pat...
  function sort_by_pointer (line 135) | inline void sort_by_pointer() {metadb_handle_list_helper::sort_by_pointe...
  function t_size (line 136) | inline t_size bsearch_by_pointer(const metadb_handle_ptr & val) const {r...
  function calc_total_duration (line 138) | inline double calc_total_duration() const {return metadb_handle_list_hel...
  type metadb_handle_list_t (line 150) | typedef metadb_handle_list_t<> metadb_handle_list;
  function namespace (line 152) | namespace metadb_handle_list_helper {
  function class (line 156) | class metadb_handle_lock
  function class (line 176) | class string_format_title {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/metadb_handle_list.cpp
  type custom_sort_data (line 7) | struct custom_sort_data
  function custom_sort_compare (line 14) | static int __cdecl custom_sort_compare(const custom_sort_data & elem1, c...
  function t_size (line 183) | t_size metadb_handle_list_helper::bsearch_by_pointer(const pfc::list_bas...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/packet_decoder.h
  function class (line 3) | class packet_decoder : public service_base {
  function class (line 78) | class packet_decoder_streamparse : public packet_decoder
  function class (line 87) | class packet_decoder_entry : public service_base
  function open (line 104) | void open(service_ptr_t<packet_decoder> & p_out,bool p_decode,const GUID...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/play_callback.h
  function class (line 8) | class NOVTABLE play_callback {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/playable_location.h
  function class (line 12) | class NOVTABLE playable_location//interface (for passing around between ...
  type playable_location (line 42) | typedef playable_location * pplayable_location;
  type playable_location (line 43) | typedef playable_location const * pcplayable_location;
  type playable_location (line 44) | typedef playable_location & rplayable_location;
  type playable_location (line 45) | typedef playable_location const & rcplayable_location;
  function class (line 47) | class playable_location_impl : public playable_location//implementation
  function set_path (line 51) | void set_path(const char* p_path) {m_path=p_path;}
  function set_subsong (line 53) | void set_subsong(t_uint32 p_subsong) {m_subsong=p_subsong;}
  function class (line 70) | class make_playable_location : public playable_location

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/playback_control.h
  type t_stop_reason (line 12) | enum t_stop_reason {
  type t_track_command (line 20) | enum t_track_command {
  type t_display_level (line 76) | enum t_display_level {
  function playback_format_title_ex (line 99) | bool playback_format_title_ex(metadb_handle_ptr p_item,titleformat_hook ...
  function toggle_stop_after_current (line 115) | void toggle_stop_after_current() {set_stop_after_current(!get_stop_after...
  function toggle_pause (line 117) | void toggle_pause() {pause(!is_paused());}
  function play_or_pause (line 120) | void play_or_pause() {if (is_playing()) toggle_pause(); else start();}
  function play_stop (line 125) | inline void play_stop() {stop();}
  function class (line 130) | class playback_control_v2 : public playback_control {
  type playback_control (line 138) | typedef playback_control play_control;

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/playlist.cpp
  class enum_items_callback_retrieve_item (line 5) | class enum_items_callback_retrieve_item : public playlist_manager::enum_...
    method enum_items_callback_retrieve_item (line 9) | enum_items_callback_retrieve_item() : m_item(0) {}
    method on_item (line 10) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
    method metadb_handle_ptr (line 16) | inline const metadb_handle_ptr & get_item() {return m_item;}
  class enum_items_callback_retrieve_selection (line 19) | class enum_items_callback_retrieve_selection : public playlist_manager::...
    method enum_items_callback_retrieve_selection (line 23) | enum_items_callback_retrieve_selection() : m_state(false) {}
    method on_item (line 24) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
    method get_state (line 29) | inline bool get_state() {return m_state;}
  class enum_items_callback_retrieve_selection_mask (line 32) | class enum_items_callback_retrieve_selection_mask : public playlist_mana...
    method enum_items_callback_retrieve_selection_mask (line 36) | enum_items_callback_retrieve_selection_mask(bit_array_var & p_out) : m...
    method on_item (line 37) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
  class enum_items_callback_retrieve_all_items (line 44) | class enum_items_callback_retrieve_all_items : public playlist_manager::...
    method enum_items_callback_retrieve_all_items (line 48) | enum_items_callback_retrieve_all_items(pfc::list_base_t<metadb_handle_...
    method on_item (line 49) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
  class enum_items_callback_retrieve_selected_items (line 56) | class enum_items_callback_retrieve_selected_items : public playlist_mana...
    method enum_items_callback_retrieve_selected_items (line 60) | enum_items_callback_retrieve_selected_items(pfc::list_base_t<metadb_ha...
    method on_item (line 61) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
  class enum_items_callback_count_selection (line 68) | class enum_items_callback_count_selection : public playlist_manager::enu...
    method enum_items_callback_count_selection (line 72) | enum_items_callback_count_selection(t_size p_max) : m_max(p_max), m_co...
    method on_item (line 73) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
    method t_size (line 82) | inline t_size get_count() {return m_counter;}
  function t_size (line 168) | t_size playlist_manager::activeplaylist_get_item_count()
  function t_size (line 181) | t_size playlist_manager::activeplaylist_get_focus_item()
  function t_size (line 229) | t_size playlist_manager::activeplaylist_insert_items(t_size p_base,const...
  function t_size (line 438) | t_size playlist_manager::playlist_get_selection_count(t_size p_playlist,...
  function t_size (line 445) | t_size playlist_manager::activeplaylist_get_selection_count(t_size p_max)
  function t_size (line 466) | t_size playlist_manager::find_playlist(const char * p_name,t_size p_name...
  function t_size (line 478) | t_size playlist_manager::find_or_create_playlist(const char * p_name,t_s...
  function t_size (line 485) | t_size playlist_manager::create_playlist_autoname(t_size p_index) {
  class enum_items_callback_remove_list (line 539) | class enum_items_callback_remove_list : public playlist_manager::enum_it...
    method enum_items_callback_remove_list (line 545) | enum_items_callback_remove_list(const metadb_handle_list & p_data,bit_...
    method on_item (line 546) | bool on_item(t_size p_index,const metadb_handle_ptr & p_location,bool ...
    method t_size (line 554) | inline t_size get_found() const {return m_found;}
  function t_uint32 (line 591) | t_uint32 playlist_manager::activeplaylist_lock_get_filter_mask()
  class completion_notify_dfd (line 652) | class completion_notify_dfd : public completion_notify {
    method completion_notify_dfd (line 654) | completion_notify_dfd(const pfc::list_base_const_t<metadb_handle_ptr> ...
    method on_completion (line 655) | void on_completion(unsigned p_code) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/playlist.h
  type t_playback_queue_item (line 65) | struct t_playback_queue_item {
  function queue_flush (line 238) | void queue_flush() {queue_remove_mask(bit_array_true());}
  function queue_is_active (line 240) | bool queue_is_active() {return queue_get_count() > 0;}
  function class (line 355) | class NOVTABLE playlist_callback
  function class (line 425) | class NOVTABLE playlist_callback_single
  function class (line 480) | class NOVTABLE dropped_files_data {
  type service_ptr_t (line 541) | typedef service_ptr_t<process_locations_notify> process_locations_notify...
  function class (line 575) | class dropped_files_data_impl : public dropped_files_data {
  type t_change_origin (line 601) | enum t_change_origin {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/playlist_loader.cpp
  class archive_callback_impl (line 6) | class archive_callback_impl : public archive_callback
    method archive_callback_impl (line 9) | archive_callback_impl(playlist_loader_callback & p_callback) : m_callb...
    method on_entry (line 10) | bool on_entry(archive * owner,const char * p_path,const t_filestats & ...
    method is_aborting (line 15) | bool is_aborting() const {return m_callback.is_aborting();}
    method abort_callback_event (line 16) | abort_callback_event get_abort_event() const {return m_callback.get_ab...
  function track_indexer__g_get_tracks_e (line 60) | static void track_indexer__g_get_tracks_e(const char * p_path,const serv...
  function track_indexer__g_get_tracks_wrap (line 98) | static void track_indexer__g_get_tracks_wrap(const char * p_path,const s...
  function process_path_internal (line 124) | static void process_path_internal(const char * p_path,const service_ptr_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/playlist_loader.h
  type t_entry_type (line 9) | enum t_entry_type {
  function class (line 49) | class playlist_loader_callback_impl : public playlist_loader_callback {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/popup_message.h
  type t_icon (line 11) | enum t_icon {icon_information, icon_error, icon_query}
  function show (line 24) | inline void show(const char * p_msg,const char * p_title,t_icon p_icon =...
  function g_show (line 29) | static inline void g_show(const char * p_msg,const char * p_title,t_icon...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/preferences_page.h
  function class (line 52) | class preferences_branch_v2 : public preferences_branch {
  function class (line 60) | class preferences_branch_impl : public preferences_branch_v2 {
  type service_factory_single_t (line 73) | typedef service_factory_single_t<preferences_branch_impl> __preferences_...
  function class (line 77) | class preferences_branch_factory : public __preferences_branch_factory {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/replaygain.cpp
  function audio_sample (line 11) | audio_sample t_replaygain_config::query_scale(const file_info & p_info) ...
  function audio_sample (line 58) | audio_sample t_replaygain_config::query_scale(const metadb_handle_ptr & ...
  function audio_sample (line 69) | audio_sample replaygain_manager::core_settings_query_scale(const file_in...
  function audio_sample (line 76) | audio_sample replaygain_manager::core_settings_query_scale(const metadb_...
  class format_dbdelta (line 86) | class format_dbdelta

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/replaygain.h
  function t_replaygain_config (line 5) | struct t_replaygain_config

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/replaygain_info.cpp
  function t_size (line 82) | t_size replaygain_info::get_value_count()
  function replaygain_info (line 128) | replaygain_info replaygain_info::g_merge(replaygain_info r1,replaygain_i...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/resampler.h
  function create_preset (line 20) | bool create_preset(dsp_preset & p_out,unsigned p_target_srate,float p_qu...
  function get_priority (line 21) | float get_priority() {return T::g_get_priority();}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/service.cpp
  function service_class_ref (line 6) | service_class_ref service_factory_base::enum_find_class(const GUID & p_g...
  function t_size (line 18) | t_size service_factory_base::enum_get_count(service_class_ref p_class)

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/service.h
  function service_release_safe (line 31) | void service_release_safe(T * p_ptr) throw() {
  function service_add_ref_safe (line 36) | void service_add_ref_safe(T * p_ptr) throw() {
  function m_ptr (line 54) | m_ptr(NULL) {copy(p_source);}
  function copy (line 66) | void copy(const service_ptr_t<t_source> & p_source) throw() {copy(p_sour...
  function release (line 75) | inline void release() throw() {
  function service_obscure_refcounting (line 81) | inline service_obscure_refcounting<T>* operator->() const throw() {PFC_A...
  function T (line 83) | inline T* get_ptr() const throw() {return m_ptr;}
  function is_valid (line 85) | inline bool is_valid() const throw() {return m_ptr != NULL;}
  function throw (line 90) | inline bool operator>(const t_self & p_item) const throw() {return m_ptr...
  function throw (line 91) | inline bool operator<(const t_self & p_item) const throw() {return m_ptr...
  function T (line 99) | inline T* __unsafe_duplicate() const throw() {//should not be used ! tem...
  function T (line 104) | inline T* __unsafe_detach() throw() {//should not be used ! temporary !
  function __unsafe_set (line 109) | void __unsafe_set(t_source * p_ptr) throw() {//should not be used ! temp...
  function namespace (line 117) | namespace pfc {
  function class (line 186) | class NOVTABLE service_base
  function is_service_present (line 244) | inline static bool is_service_present(const GUID & g) {return enum_get_c...
  function t_size (line 287) | t_size get_count() const {
  function t_interface (line 343) | t_interface* get_ptr() const {return m_ptr.get_ptr();}
  function t_ptr (line 360) | const t_ptr & operator[](t_size p_index) const {return m_data[p_index];}
  function reset (line 374) | void reset() {m_index = 0;}
  function instance_create (line 418) | void instance_create(service_ptr_t<service_base> & p_out) {
  function T (line 422) | inline T& get_static_instance() {return g_instance;}
  function instance_create (line 433) | void instance_create(service_ptr_t<service_base> & p_out) {
  function T (line 437) | inline T& get_static_instance() {return instance;}
  function T (line 451) | inline T& get_static_instance() {return *(T*)this;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/service_impl.h
  function service_add_ref (line 11) | int FB2KAPI service_add_ref() throw() {return ++m_counter;}
  function service_add_ref (line 25) | int FB2KAPI service_add_ref() throw() {return 1;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/tag_processor.cpp
  function tagtype_list_append (line 27) | static void tagtype_list_append(pfc::string_base & p_out,const char * p_...
  function g_write_tags_ex (line 33) | static void g_write_tags_ex(tag_write_callback & p_callback,unsigned p_f...
  function g_write_tags (line 66) | static void g_write_tags(unsigned p_flags,const service_ptr_t<file> & p_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/tag_processor.h
  function class (line 23) | class tag_write_callback_dummy : public tag_write_callback {
  function namespace (line 66) | namespace tag_processor {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/threaded_process.h
  function class (line 4) | class NOVTABLE threaded_process_status
  function virtual (line 33) | virtual void on_done(HWND p_wnd,bool p_was_aborted) {}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/titleformat.cpp
  function test_for_bad_char (line 18) | static bool test_for_bad_char(const char * source,t_size source_char_len...
  function t_size (line 671) | t_size titleformat_hook_function_params::get_param_uint(t_size index)
  type titleformat_inputtypes (line 745) | namespace titleformat_inputtypes {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/titleformat.h
  function namespace (line 4) | namespace titleformat_inputtypes {
  function class (line 8) | class NOVTABLE titleformat_text_out {
  function class (line 19) | class NOVTABLE titleformat_text_filter {
  function class (line 27) | class NOVTABLE titleformat_hook_function_params
  function class (line 37) | class NOVTABLE titleformat_hook
  function compile_force (line 68) | void compile_force(service_ptr_t<titleformat_object> & p_out,const char ...
  function class (line 80) | class titleformat_object_wrapper {
  function class (line 96) | class titleformat_text_out_impl_filter_chars : public titleformat_text_out
  function class (line 107) | class titleformat_text_out_impl_string : public titleformat_text_out {
  function class (line 115) | class titleformat_hook_impl_file_info : public titleformat_hook
  function class (line 132) | class titleformat_hook_impl_splitter : public titleformat_hook {
  function class (line 141) | class titleformat_text_filter_impl_reserved_chars : public titleformat_t...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/titleformat_config.cpp
  function GUID (line 79) | GUID titleformat_config_impl::get_guid() {return m_guid;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/titleformat_config.h
  function class (line 28) | class titleformat_config_callback : public service_base
  type service_factory_single_transparent_t (line 62) | typedef service_factory_single_transparent_t<titleformat_config_impl> ti...

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/track_property.h
  function class (line 2) | class NOVTABLE track_property_callback {

FILE: plugins/foobar09/foobar_sdk/foobar2000/SDK/utf8api.cpp
  function HWND (line 3) | HWND uCreateDialog(UINT id,HWND parent,DLGPROC proc,LPARAM param)
  function uDialogBox (line 8) | int uDialogBox(UINT id,HWND parent,DLGPROC proc,LPARAM param)

FILE: plugins/foobar09/foobar_sdk/foobar2000/foo_input_raw/foo_input_raw.cpp
  class input_raw (line 13) | class input_raw {
    method open (line 15) | void open(service_ptr_t<file> p_filehint,const char * p_path,t_input_o...
    method get_info (line 21) | void get_info(file_info & p_info,abort_callback & p_abort) {
    method t_filestats (line 35) | t_filestats get_file_stats(abort_callback & p_abort) {return m_file->g...
    method decode_initialize (line 37) | void decode_initialize(unsigned p_flags,abort_callback & p_abort) {
    method decode_run (line 40) | bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort) {
    method decode_seek (line 53) | void decode_seek(double p_seconds,abort_callback & p_abort) {
    method decode_can_seek (line 64) | bool decode_can_seek() {return m_file->can_seek();}
    method decode_get_dynamic_info (line 65) | bool decode_get_dynamic_info(file_info & p_out, double & p_timestamp_d...
    method decode_get_dynamic_info_track (line 66) | bool decode_get_dynamic_info_track(file_info & p_out, double & p_times...
    method decode_on_idle (line 67) | void decode_on_idle(abort_callback & p_abort) {m_file->on_idle(p_abort);}
    method retag (line 69) | void retag(const file_info & p_info,abort_callback & p_abort) {throw e...
    method g_is_our_content_type (line 71) | static bool g_is_our_content_type(const char * p_content_type) {return...
    method g_is_our_path (line 72) | static bool g_is_our_path(const char * p_path,const char * p_extension...

FILE: plugins/foobar09/foobar_sdk/foobar2000/foobar2000_component_client/component_client.cpp
  type core_api (line 12) | namespace core_api
    function HINSTANCE (line 15) | HINSTANCE get_my_instance()
    function HWND (line 20) | HWND get_main_window()
    function pcchar (line 24) | pcchar get_my_file_name()
    function pcchar (line 29) | pcchar get_my_full_path()
    function are_services_available (line 34) | bool are_services_available()
    function assert_main_thread (line 38) | bool assert_main_thread()
    function ensure_main_thread (line 43) | void ensure_main_thread() {
    function is_main_thread (line 47) | bool is_main_thread()
    function pcchar (line 51) | pcchar get_profile_path()
    function is_shutting_down (line 56) | bool is_shutting_down()
    function is_initializing (line 60) | bool is_initializing()
  class foobar2000_client_impl (line 67) | class foobar2000_client_impl : public foobar2000_client
    method t_uint32 (line 70) | t_uint32 get_version() {return FOOBAR2000_CLIENT_VERSION;}
    method pservice_factory_base (line 71) | pservice_factory_base get_service_list() {return service_factory_base:...
    method get_config (line 73) | void get_config(stream_writer * p_stream,abort_callback & p_abort) {
    method set_config (line 77) | void set_config(stream_reader * p_stream,abort_callback & p_abort) {
    method set_library_path (line 81) | void set_library_path(const char * path,const char * name) {
    method services_init (line 86) | void services_init(bool val) {
    method is_debug (line 91) | bool is_debug() {
  function foobar2000_client (line 105) | __declspec(dllexport) foobar2000_client * _cdecl foobar2000_get_interfac...
  function BOOLEAN (line 115) | BOOLEAN WINAPI DllMain(IN HINSTANCE hDllHandle, IN DWORD     nReason,  I...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/bitreader_helper.h
  function namespace (line 1) | namespace bitreader_helper {
  function class (line 58) | class bitreader_fromfile
  function class (line 91) | class bitreader_limited
  function skip (line 100) | inline void skip(t_size p_bits) {
  function t_size (line 106) | t_size read(t_size p_bits)
  function t_size (line 118) | inline static t_size extract_bits(const t_uint8 * p_buffer,t_size p_base...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cfg_guidlist.h
  function set_data_raw (line 9) | void set_data_raw(stream_reader * p_stream,t_size p_sizehint,abort_callb...
  function sort (line 20) | void sort() {sort_t(pfc::guid_compare);}
  function have_item_bsearch (line 22) | bool have_item_bsearch(const GUID & p_item) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cfg_structlist.h
  function public (line 2) | public pfc::list_t<T>

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/create_directory_helper.cpp
  type create_directory_helper (line 4) | namespace create_directory_helper
    function create_path_internal (line 6) | static void create_path_internal(const char * p_path,t_size p_base,abo...
    function is_valid_netpath_char (line 16) | static bool is_valid_netpath_char(char p_char) {
    function test_localpath (line 20) | static bool test_localpath(const char * p_path) {
    function test_netpath (line 26) | static bool test_netpath(const char * p_path) {
    function create_path (line 39) | void create_path(const char * p_path,abort_callback & p_abort) {
    function is_bad_dirchar (line 56) | static bool is_bad_dirchar(char c)
    function make_path (line 61) | void make_path(const char * parent,const char * filename,const char * ...
  class titleformat_text_filter_impl_createdir (line 117) | class titleformat_text_filter_impl_createdir : public titleformat_text_f...
    method on_new_field (line 120) | void on_new_field() {}
    method write (line 121) | void write(const GUID & p_inputtype,pfc::string_receiver & p_out,const...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/create_directory_helper.h
  function namespace (line 4) | namespace create_directory_helper {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cue_creator.cpp
  class format_meta (line 6) | class format_meta
    method format_meta (line 9) | format_meta(const file_info & p_source,const char * p_name,bool p_allo...
  function is_meta_same_everywhere (line 23) | static bool is_meta_same_everywhere(const cue_creator::t_entry_list & p_...
  type cue_creator (line 42) | namespace cue_creator
    function create (line 44) | void create(pfc::string_formatter & p_out,const t_entry_list & p_data)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cue_creator.h
  function namespace (line 1) | namespace cue_creator

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cue_parser.cpp
  function is_numeric (line 7) | static bool is_numeric(char c) {return c>='0' && c<='9';}
  function is_spacing (line 10) | static bool is_spacing(char c)
  function is_linebreak (line 15) | static bool is_linebreak(char c)
  function validate_file_type (line 20) | static void validate_file_type(const char * p_type,t_size p_type_length) {
  function cue_parser_callback (line 37) | class NOVTABLE cue_parser_callback
  function cue_parser_callback_meta (line 53) | class NOVTABLE cue_parser_callback_meta : public cue_parser_callback
  function on_comment (line 71) | void on_comment(const char * p_comment,t_size p_comment_length)
  function on_title (line 98) | void on_title(const char * p_title,t_size p_title_length)
  function on_songwriter (line 102) | void on_songwriter(const char * p_songwriter,t_size p_songwriter_length) {
  function on_performer (line 105) | void on_performer(const char * p_performer,t_size p_performer_length)
  function on_isrc (line 110) | void on_isrc(const char * p_isrc,t_size p_isrc_length)
  function on_catalog (line 114) | void on_catalog(const char * p_catalog,t_size p_catalog_length)
  function on_flags (line 118) | void on_flags(const char * p_flags,t_size p_flags_length) {}
  class cue_parser_callback_retrievelist (line 122) | class cue_parser_callback_retrievelist : public cue_parser_callback
    method cue_parser_callback_retrievelist (line 125) | cue_parser_callback_retrievelist(pfc::chain_list_t<cue_parser::cue_ent...
    method on_file (line 129) | void on_file(const char * p_file,t_size p_file_length,const char * p_t...
    method on_track (line 135) | void on_track(unsigned p_index,const char * p_type,t_size p_type_length)
    method on_pregap (line 145) | void on_pregap(unsigned p_value) {m_pregap = (double) p_value / 75.0;}
    method on_index (line 147) | void on_index(unsigned p_index,unsigned p_value)
    method on_title (line 160) | void on_title(const char * p_title,t_size p_title_length) {}
    method on_performer (line 161) | void on_performer(const char * p_performer,t_size p_performer_length) {}
    method on_songwriter (line 162) | void on_songwriter(const char * p_songwriter,t_size p_songwriter_lengt...
    method on_isrc (line 163) | void on_isrc(const char * p_isrc,t_size p_isrc_length) {}
    method on_catalog (line 164) | void on_catalog(const char * p_catalog,t_size p_catalog_length) {}
    method on_comment (line 165) | void on_comment(const char * p_comment,t_size p_comment_length) {}
    method on_flags (line 166) | void on_flags(const char * p_flags,t_size p_flags_length) {}
    method finalize (line 168) | void finalize()
    method finalize_track (line 178) | void finalize_track()
  class cue_parser_callback_retrieveinfo (line 205) | class cue_parser_callback_retrieveinfo : public cue_parser_callback_meta
    method cue_parser_callback_retrieveinfo (line 208) | cue_parser_callback_retrieveinfo(file_info & p_out,unsigned p_wanted_t...
    method on_file (line 210) | void on_file(const char * p_file,t_size p_file_length,const char * p_t...
    method on_track (line 212) | void on_track(unsigned p_index,const char * p_type,t_size p_type_length)
    method on_pregap (line 223) | void on_pregap(unsigned p_value) {if (m_track == m_wanted_track) m_pre...
    method on_index (line 225) | void on_index(unsigned p_index,unsigned p_value)
    method on_meta (line 239) | void on_meta(const char * p_name,t_size p_name_length,const char * p_v...
    method finalize (line 282) | void finalize()
    type t_meta_entry (line 333) | struct t_meta_entry {
    method find_first_field (line 338) | static t_meta_list::const_iterator find_first_field(t_meta_list const ...
    method wipe_field (line 348) | static void wipe_field(t_meta_list & p_list,const char * p_field)
  function g_parse_cue_line (line 380) | static void g_parse_cue_line(const char * p_line,t_size p_line_length,cu...
  function g_parse_cue (line 594) | static void g_parse_cue(const char * p_cuesheet,cue_parser_callback & p_...
  class cue_parser_callback_retrievecount (line 642) | class cue_parser_callback_retrievecount : public cue_parser_callback
    method cue_parser_callback_retrievecount (line 645) | cue_parser_callback_retrievecount() : m_count(0) {}
    method get_count (line 646) | unsigned get_count() const {return m_count;}
    method on_file (line 647) | void on_file(const char * p_file,t_size p_file_length,const char * p_t...
    method on_track (line 648) | void on_track(unsigned p_index,const char * p_type,t_size p_type_lengt...
    method on_pregap (line 649) | void on_pregap(unsigned p_value) {}
    method on_index (line 650) | void on_index(unsigned p_index,unsigned p_value) {}
    method on_title (line 651) | void on_title(const char * p_title,t_size p_title_length) {}
    method on_performer (line 652) | void on_performer(const char * p_performer,t_size p_performer_length) {}
    method on_isrc (line 653) | void on_isrc(const char * p_isrc,t_size p_isrc_length) {}
    method on_catalog (line 654) | void on_catalog(const char * p_catalog,t_size p_catalog_length) {}
    method on_comment (line 655) | void on_comment(const char * p_comment,t_size p_comment_length) {}
    method on_flags (line 656) | void on_flags(const char * p_flags,t_size p_flags_length) {}
  class cue_parser_callback_retrievecreatorentries (line 661) | class cue_parser_callback_retrievecreatorentries : public cue_parser_cal...
    method cue_parser_callback_retrievecreatorentries (line 664) | cue_parser_callback_retrievecreatorentries(cue_creator::t_entry_list &...
    method on_file (line 666) | void on_file(const char * p_file,t_size p_file_length,const char * p_t...
    method on_track (line 671) | void on_track(unsigned p_index,const char * p_type,t_size p_type_length)
    method on_pregap (line 681) | void on_pregap(unsigned p_value)
    method on_index (line 686) | void on_index(unsigned p_index,unsigned p_value)
    method on_title (line 698) | void on_title(const char * p_title,t_size p_title_length) {}
    method on_performer (line 699) | void on_performer(const char * p_performer,t_size p_performer_length) {}
    method on_songwriter (line 700) | void on_songwriter(const char * p_performer,t_size p_performer_length) {}
    method on_isrc (line 701) | void on_isrc(const char * p_isrc,t_size p_isrc_length) {}
    method on_catalog (line 702) | void on_catalog(const char * p_catalog,t_size p_catalog_length) {}
    method on_comment (line 703) | void on_comment(const char * p_comment,t_size p_comment_length) {}
    method finalize (line 704) | void finalize()
    method on_flags (line 712) | void on_flags(const char * p_flags,t_size p_flags_length) {
    method finalize_track (line 716) | void finalize_track()

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cue_parser.h
  function namespace (line 4) | namespace file_info_record_helper {
  function namespace (line 139) | namespace cue_parser

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cue_parser_embedding.cpp
  function build_cue_meta_name (line 5) | static void build_cue_meta_name(const char * p_name,unsigned p_tracknumb...
  function is_reserved_meta_entry (line 10) | static bool is_reserved_meta_entry(const char * p_name) {
  function is_global_meta_entry (line 14) | static bool is_global_meta_entry(const char * p_name) {
  function is_allowed_field (line 18) | static bool is_allowed_field(const char * p_name) {
  class __get_tag_cue_track_list_builder (line 22) | class __get_tag_cue_track_list_builder {
    method __get_tag_cue_track_list_builder (line 24) | __get_tag_cue_track_list_builder(cue_creator::t_entry_list & p_entries...
  class __get_tag__enum_fields_enumerator (line 41) | class __get_tag__enum_fields_enumerator {
    method __get_tag__enum_fields_enumerator (line 43) | __get_tag__enum_fields_enumerator(field_name_list & p_out) : m_out(p_o...
  class __get_tag__is_field_global_check (line 55) | class __get_tag__is_field_global_check {
    method __get_tag__is_field_global_check (line 59) | __get_tag__is_field_global_check(const char * p_field) : m_field(p_fie...
    method finalize (line 74) | void finalize(file_info_record::t_meta_map & p_globals) {
  class __get_tag__filter_globals (line 85) | class __get_tag__filter_globals {
    method __get_tag__filter_globals (line 87) | __get_tag__filter_globals(track_record_list const & p_tracks,file_info...
  class __get_tag__local_field_filter (line 101) | class __get_tag__local_field_filter {
    method __get_tag__local_field_filter (line 103) | __get_tag__local_field_filter(const file_info_record::t_meta_map & p_g...
  function strip_redundant_track_meta (line 125) | static void strip_redundant_track_meta(unsigned p_tracknumber,const file...
  function resolve_cue_meta_name (line 200) | static bool resolve_cue_meta_name(const char * p_name,pfc::string_base &...
  class __set_tag_global_field_relay (line 216) | class __set_tag_global_field_relay {
    method __set_tag_global_field_relay (line 218) | __set_tag_global_field_relay(const file_info & p_info,t_size p_index) ...
  class __remap_trackno_enumerator (line 327) | class __remap_trackno_enumerator {
    method __remap_trackno_enumerator (line 329) | __remap_trackno_enumerator(unsigned p_index) : m_countdown(p_index), m...
    method result (line 339) | unsigned result() const {return m_result;}
  function t_size (line 356) | t_size embeddedcue_metadata_manager::get_cue_track_count() const {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cuesheet_index_list.cpp
  function is_numeric (line 3) | static bool is_numeric(char c) {return c>='0' && c<='9';}
  function parse_value (line 42) | static bool parse_value(const char * p_name,double & p_out)
  function cuesheet_parse_index_time_e (line 81) | double cuesheet_parse_index_time_e(const char * p_string,t_size p_length)
  function cuesheet_parse_index_time_ticks_e (line 86) | unsigned cuesheet_parse_index_time_ticks_e(const char * p_string,t_size ...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/cuesheet_index_list.h
  function t_cuesheet_index_list (line 1) | struct t_cuesheet_index_list
  function reset (line 6) | void reset() {for(unsigned n=0;n<count;n++) m_positions[n]=0;}
  function is_empty (line 16) | bool is_empty() const;

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/dialog_resize_helper.cpp
  function GetChildRect (line 66) | void GetChildRect(HWND wnd,UINT id,RECT* child)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/dialog_resize_helper.h
  function namespace (line 6) | namespace resize
  function class (line 19) | class dialog_resize_helper
  function set_max_size (line 42) | inline void set_max_size(unsigned x,unsigned y) {max_x = x; max_y = y;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/dropdown_helper.cpp
  function g_setup_dropdown_fromlist (line 33) | static void g_setup_dropdown_fromlist(HWND wnd,const pfc::ptr_list_t<cha...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/dropdown_helper.h
  function class (line 5) | class cfg_dropdown_history

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/dynamic_bitrate_helper.cpp
  function g_query_settings (line 3) | static unsigned g_query_settings()

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/dynamic_bitrate_helper.h
  function class (line 1) | class dynamic_bitrate_helper

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_cached.h
  function write (line 54) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
  function t_filesize (line 63) | t_filesize get_size(abort_callback & p_abort) {
  function t_filesize (line 67) | t_filesize get_position(abort_callback & p_abort) {
  function set_eof (line 71) | void set_eof(abort_callback & p_abort) {
  function seek (line 77) | void seek(t_filesize p_position,abort_callback & p_abort) {
  function reopen (line 83) | void reopen(abort_callback & p_abort) {seek(0,p_abort);}
  function can_seek (line 84) | bool can_seek() {return m_can_seek;}
  function get_content_type (line 85) | bool get_content_type(pfc::string_base & out) {return m_base->get_conten...
  function on_idle (line 86) | void on_idle(abort_callback & p_abort) {p_abort.check();m_base->on_idle(...
  function t_filetimestamp (line 87) | t_filetimestamp get_timestamp(abort_callback & p_abort) {p_abort.check()...
  function is_remote (line 88) | bool is_remote() {return m_base->is_remote();}
  function resize (line 89) | void resize(t_filesize p_size,abort_callback & p_abort) {
  function flush_buffer (line 104) | void flush_buffer() {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_info_const_impl.cpp
  class sort_callback_hintmap_impl (line 66) | class sort_callback_hintmap_impl : public pfc::sort_callback
    method sort_callback_hintmap_impl (line 69) | sort_callback_hintmap_impl(const file_info_const_impl::meta_entry * p_...
    method compare (line 74) | int compare(t_size p_index1, t_size p_index2) const
    method swap (line 80) | void swap(t_size p_index1, t_size p_index2)
  class bsearch_callback_hintmap_impl (line 89) | class bsearch_callback_hintmap_impl : public pfc::bsearch_callback
    method bsearch_callback_hintmap_impl (line 92) | bsearch_callback_hintmap_impl(
    method test (line 101) | int test(t_size p_index) const
  function t_size (line 259) | t_size file_info_const_impl::meta_find_ex(const char * p_name,t_size p_n...
  function t_size (line 275) | t_size	file_info_const_impl::meta_enum_value_count(t_size p_index) const

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_info_const_impl.h
  function class (line 4) | class file_info_const_impl : public file_info
  function t_size (line 34) | t_size		meta_set_ex(const char * p_name,t_size p_name_length,const char ...
  function meta_insert_value_ex (line 35) | void		meta_insert_value_ex(t_size p_index,t_size p_value_index,const cha...
  function meta_remove_mask (line 36) | void		meta_remove_mask(const bit_array & p_mask) {throw pfc::exception_b...
  function meta_reorder (line 37) | void		meta_reorder(const t_size * p_order) {throw pfc::exception_bug_che...
  function meta_remove_values (line 38) | void		meta_remove_values(t_size p_index,const bit_array & p_mask) {throw...
  function meta_modify_value_ex (line 39) | void		meta_modify_value_ex(t_size p_index,t_size p_value_index,const cha...
  function t_size (line 41) | t_size		info_set_ex(const char * p_name,t_size p_name_length,const char ...
  function info_remove_mask (line 42) | void		info_remove_mask(const bit_array & p_mask) {throw pfc::exception_b...
  function set_replaygain (line 44) | void			set_replaygain(const replaygain_info & p_info) {throw pfc::except...
  function t_size (line 46) | t_size		meta_set_nocheck_ex(const char * p_name,t_size p_name_length,con...
  function t_size (line 47) | t_size		info_set_nocheck_ex(const char * p_name,t_size p_name_length,con...
  type meta_entry (line 49) | struct meta_entry {
  type info_entry (line 55) | struct info_entry {
  type t_uint32 (line 61) | typedef t_uint32 t_index;

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_list_helper.cpp
  function file_list_remove_duplicates (line 3) | static void file_list_remove_duplicates(pfc::ptr_list_t<char> & out)
  type file_list_helper (line 18) | namespace file_list_helper
    function t_size (line 55) | t_size file_list_from_metadb_handle_list::get_count() const {return m_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_list_helper.h
  function namespace (line 5) | namespace file_list_helper

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_move_helper.cpp
  function grab_items_by_path (line 3) | static bool grab_items_by_path(pfc::list_base_t<metadb_handle_ptr> & p_o...
  function t_size (line 153) | t_size file_move_helper::g_filter_dead_files_sorted_make_mask(pfc::list_...
  function t_size (line 167) | t_size file_move_helper::g_filter_dead_files_sorted(pfc::list_base_t<met...
  function t_size (line 175) | t_size file_move_helper::g_filter_dead_files(pfc::list_base_t<metadb_han...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_move_helper.h
  function class (line 1) | class file_move_callback_manager
  function class (line 25) | class file_move_helper

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_win32_wrapper.h
  function namespace (line 1) | namespace file_win32_helpers {
  function service_ptr_t (line 37) | static service_ptr_t<file> g_CreateFile(const char * p_path,DWORD p_acce...
  function service_ptr_t (line 46) | static service_ptr_t<file> g_create_from_handle(HANDLE p_handle) {
  function reopen (line 51) | void reopen(abort_callback & p_abort) {seek(0,p_abort);}
  function write (line 53) | void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
  function t_size (line 82) | t_size read(void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
  function t_filesize (line 109) | t_filesize get_size(abort_callback & p_abort) {
  function t_filesize (line 114) | t_filesize get_position(abort_callback & p_abort) {
  function resize (line 119) | void resize(t_filesize p_size,abort_callback & p_abort) {
  function set_eof (line 136) | void set_eof(abort_callback & p_abort) {
  function seek (line 145) | void seek(t_filesize p_position,abort_callback & p_abort) {
  function seek_ex (line 154) | void seek_ex(t_sfilesize p_position,file::t_seek_mode p_mode,abort_callb...
  function can_seek (line 164) | bool can_seek() {return p_seekable;}
  function get_content_type (line 165) | bool get_content_type(pfc::string_base & out) {return false;}
  function is_in_memory (line 166) | bool is_in_memory() {return false;}
  function on_idle (line 167) | void on_idle(abort_callback & p_abort) {p_abort.check_e();}
  function t_filetimestamp (line 169) | t_filetimestamp get_timestamp(abort_callback & p_abort) {
  function is_remote (line 178) | bool is_remote() {return false;}

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_wrapper_simple.cpp
  function t_size (line 3) | t_size file_wrapper_simple::read(void * p_buffer,t_size p_bytes) {
  function t_size (line 13) | t_size file_wrapper_simple::write(const void * p_buffer,t_size p_bytes) {
  function t_filesize (line 35) | t_filesize file_wrapper_simple::get_position() {
  function t_filesize (line 57) | t_filesize file_wrapper_simple::get_size() {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/file_wrapper_simple.h
  function class (line 1) | class file_wrapper_simple

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/format_title_group.cpp
  class titleformat_hook_impl (line 4) | class titleformat_hook_impl : public titleformat_hook {
    method titleformat_hook_impl (line 6) | titleformat_hook_impl(pfc::list_base_const_t<metadb_handle_ptr> const ...
    method process_field (line 13) | bool process_field(titleformat_text_out * p_out,const char * p_name,t_...
    method process_function (line 26) | bool process_function(titleformat_text_out * p_out,const char * p_name...
    method process_own_field (line 39) | bool process_own_field(titleformat_text_out * p_out,const char * p_nam...
  function format_title_group (line 61) | void format_title_group(pfc::list_base_const_t<metadb_handle_ptr> const ...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/inplace_edit.cpp
  function LRESULT (line 15) | static LRESULT CALLBACK GMouseProc(int nCode,WPARAM wParam,LPARAM lParam) {
  function on_editbox_creation (line 36) | void on_editbox_creation(HWND p_editbox) {
  function on_editbox_destruction (line 42) | void on_editbox_destruction(HWND p_editbox) {
  class InPlaceEditHook (line 54) | class InPlaceEditHook {
    method InPlaceEditHook (line 56) | InPlaceEditHook(HWND p_wnd) : m_oldproc(NULL)
    method ForwardCompletion (line 63) | static void ForwardCompletion(HWND p_mywnd,unsigned p_code) {
    method LRESULT (line 70) | LRESULT EditHook(HWND p_wnd,UINT p_msg,WPARAM p_wp,LPARAM p_lp) {
    method LRESULT (line 107) | static LRESULT CALLBACK GEditHook(HWND p_wnd,UINT p_msg,WPARAM p_wp,LP...
  class InPlaceEditContainer (line 116) | class InPlaceEditContainer {
    method InPlaceEditContainer (line 118) | InPlaceEditContainer(HWND p_parentwnd,const RECT & p_rect,unsigned p_f...
    method LRESULT (line 196) | LRESULT WndProc(HWND p_wnd,UINT p_msg,WPARAM p_wp,LPARAM p_lp) {
    method LRESULT (line 233) | static LRESULT CALLBACK GWndProc(HWND p_wnd,UINT p_msg,WPARAM p_wp,LPA...
    method OnCompletion (line 247) | void OnCompletion(unsigned p_status) {
  function fail (line 267) | static void fail(completion_notify_ptr p_notify) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/inplace_edit.h
  function namespace (line 1) | namespace InPlaceEdit {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/input_helpers.cpp
  function process_fullbuffer (line 8) | static void process_fullbuffer(service_ptr_t<file> & p_file,const char *...
  class dead_item_filter_impl_simple (line 200) | class dead_item_filter_impl_simple : public dead_item_filter
    method dead_item_filter_impl_simple (line 203) | inline dead_item_filter_impl_simple(abort_callback & p_abort) : m_abor...
    method is_aborting (line 204) | bool is_aborting() const {return m_abort.is_aborting();}
    method abort_callback_event (line 205) | abort_callback_event get_abort_event() const {return m_abort.get_abort...
    method on_progress (line 206) | void on_progress(t_size p_position,t_size p_total) {}

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/input_helpers.h
  function class (line 4) | class input_helper {
  function class (line 45) | class input_info_read_helper {
  function class (line 59) | class input_helper_cue {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/listview_helper.cpp
  type listview_helper (line 10) | namespace listview_helper {
    function insert_item (line 12) | unsigned insert_item(HWND p_listview,unsigned p_index,const char * p_n...
    function insert_column (line 33) | unsigned insert_column(HWND p_listview,unsigned p_index,const char * p...
    function get_item_text (line 53) | void get_item_text(HWND p_listview,unsigned p_index,unsigned p_column,...
    function set_item_text (line 60) | bool set_item_text(HWND p_listview,unsigned p_index,unsigned p_column,...
    function is_item_selected (line 75) | bool is_item_selected(HWND p_listview,unsigned p_index)
    function set_item_selection (line 86) | bool set_item_selection(HWND p_listview,unsigned p_index,bool p_state)
    function select_single_item (line 97) | bool select_single_item(HWND p_listview,unsigned p_index)
    function ensure_visible (line 110) | bool ensure_visible(HWND p_listview,unsigned p_index)
  function ListView_GetContextMenuPoint (line 118) | bool ListView_GetContextMenuPoint(HWND p_list,LPARAM p_coords,POINT & p_...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/listview_helper.h
  function namespace (line 1) | namespace listview_helper
  function ListView_GetFirstSelection (line 21) | static int ListView_GetFirstSelection(HWND p_listview) {
  function ListView_GetSingleSelection (line 25) | static int ListView_GetSingleSelection(HWND p_listview) {
  function ListView_GetFocusItem (line 30) | static int ListView_GetFocusItem(HWND p_listview) {
  function ListView_IsItemSelected (line 34) | static bool ListView_IsItemSelected(HWND p_listview,int p_index) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/meta_table_builder.h
  function class (line 1) | class __meta_table_enum_wrapper {
  function class (line 16) | class meta_table_builder {
  function remove (line 24) | void remove(const char * p_name) {
  function set (line 27) | void set(const char * p_name,const char * p_value,t_size p_value_len = i...
  function finalize (line 38) | void finalize(file_info & p_info) {
  function from_info (line 43) | void from_info(const file_info & p_info) {
  function from_info_overwrite (line 47) | void from_info_overwrite(const file_info & p_info) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/metadb_io_hintlist.h
  function class (line 2) | class metadb_io_hintlist {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/mp3_utils.cpp
  function extract_header_bits (line 5) | static unsigned extract_header_bits(const t_uint8 p_header[4],unsigned p...
  class header_parser (line 13) | class header_parser
    method header_parser (line 16) | header_parser(const t_uint8 p_header[4]) : m_bitptr(0)
    method read (line 20) | unsigned read(unsigned p_bits)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/mp3_utils.h
  function namespace (line 1) | namespace mp3_utils
  function class (line 33) | class mp3header
  function get_bytes (line 46) | inline void get_bytes(void * out) {memcpy(out,bytes,4);}
  function get_frame_size (line 47) | inline unsigned get_frame_size() const {return mp3_utils::QueryMPEGFrame...
  function mp3header (line 53) | static inline mp3header mp3header_from_buffer(const void * p_buffer)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/preload_info_helper.h
  function namespace (line 1) | namespace preload_info_helper {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/search_filter.cpp
  function is_spacing (line 3) | static bool is_spacing(char c) {return c == ' ' || c==10 || c==13;}
  function is_alpha (line 4) | static bool is_alpha(char c) {return (c>='a' && c<='z') || (c>='A' && c<...
  function is_alphanumeric (line 5) | static bool is_alphanumeric(char c) {return is_alpha(c) || (c>='0' && c<...
  function is_spacing_or_null (line 6) | static bool is_spacing_or_null(char c) {return c == 0 || is_spacing(c);}
  function is_format_spec (line 8) | static bool is_format_spec(const char * ptr) {return strchr(ptr,'%') || ...
  type search_tools (line 10) | namespace search_tools {
    class substring_filter (line 12) | class substring_filter {
      method substring_filter (line 16) | substring_filter(const char * src) {
      method test (line 28) | bool test(const char * src) const 		{
    class filter_node_and (line 41) | class filter_node_and : public filter_node 	{
      method filter_node_and (line 44) | filter_node_and(filter_node_cptr p1,filter_node_cptr p2) : n1(p1), n...
      method test (line 45) | virtual bool test(const file_info * item,const metadb_handle_ptr & h...
    class filter_node_or (line 48) | class filter_node_or : public filter_node {
      method filter_node_or (line 51) | filter_node_or(filter_node_cptr p1,filter_node_cptr p2) : n1(p1), n2...
      method test (line 52) | virtual bool test(const file_info * item,const metadb_handle_ptr & h...
    class filter_node_not (line 55) | class filter_node_not : public filter_node {
      method filter_node_not (line 58) | filter_node_not(filter_node_cptr p) : n(p) {}
      method test (line 59) | virtual bool test(const file_info * item,const metadb_handle_ptr & h...
    class filter_node_missing (line 62) | class filter_node_missing : public filter_node {
      method filter_node_missing (line 65) | filter_node_missing(const char * p_string,t_size p_len) {
      method test (line 71) | bool test(const file_info * item,const metadb_handle_ptr & handle) c...
    class filter_node_is_format (line 76) | class filter_node_is_format : public filter_node {
      method test_internal (line 81) | bool test_internal(const char * src) const {
      method filter_node_is_format (line 86) | filter_node_is_format(const char * p_field,const char * p_param)
      method test (line 93) | bool test(const file_info * item,const metadb_handle_ptr & handle) c...
    class filter_node_is (line 99) | class filter_node_is : public filter_node {
      method test_internal (line 103) | bool test_internal(const char * src) const {
      method filter_node_is (line 108) | filter_node_is(const char * p_field,const char * p_param)
      method test (line 113) | bool test(const file_info * item,const metadb_handle_ptr & handle) c...
    class filter_node_has (line 125) | class filter_node_has : public filter_node {
      method filter_node_has (line 130) | filter_node_has(const char * p_field,const char * p_param)
      method test (line 137) | bool test(const file_info * item,const metadb_handle_ptr & handle) c...
    class filter_node_has_ex (line 151) | class filter_node_has_ex : public filter_node {
      method filter_node_has_ex (line 156) | filter_node_has_ex(const char * p_field,const char * p_param)
      method test (line 161) | bool test(const file_info * item,const metadb_handle_ptr & handle) c...
    class filter_node_simple (line 167) | class filter_node_simple : public filter_node {
      method filter_node_simple (line 171) | filter_node_simple(const char * src) : m_filter(src) {}
      method test (line 172) | bool test(const file_info * info,const metadb_handle_ptr & handle) c...
    class parser (line 193) | class parser {
      method parser (line 197) | inline parser() : base(0), len(0), ptr(0) {}
      method parser (line 198) | inline parser(const char * p_ptr,t_size p_len) : base(p_ptr), len(p_...
      method parser (line 199) | inline parser(const parser & param) : base(param.get_ptr()), len(par...
      method parser (line 200) | inline parser(const parser & param,t_size len) : base(param.get_ptr(...
      method t_size (line 202) | inline t_size get_remaining() const {return len-ptr;}
      method t_size (line 203) | inline t_size advance(t_size n) {ptr+=n; assert(ptr<=len);return n;}
      method get_char (line 204) | inline char get_char() const {return get_ptr()[0];}
      method t_size (line 205) | inline t_size get_offset() const {return ptr;}
      method reset (line 206) | inline void reset(t_size offset=0) {ptr=offset;}
      method t_size (line 208) | t_size test_spacing() const {
      method t_size (line 215) | t_size skip_spacing() {
      method is_empty (line 219) | bool is_empty() const {return test_spacing() == get_remaining();}
      method t_size (line 221) | t_size test_token() const {
      method t_size (line 259) | t_size skip_token() {
    function filter_node_cptr (line 266) | static filter_node_cptr operator_handler_and(const parser & token_left...
    function filter_node_cptr (line 270) | static filter_node_cptr operator_handler_or(const parser & token_left,...
    function filter_node_cptr (line 274) | static filter_node_cptr operator_handler_not(const parser & token_left...
    function filter_node_cptr (line 279) | static filter_node_cptr operator_handler_missing(const parser & token_...
    function parse_string (line 285) | static void parse_string(const parser & src,pfc::string_base & out)
    function filter_node_cptr (line 312) | static filter_node_cptr operator_handler_has(const parser & token_left...
    function filter_node_cptr (line 320) | static filter_node_cptr operator_handler_is(const parser & token_left,...
    class filter_node_mathop (line 328) | class filter_node_mathop : public filter_node
      method t_int64 (line 337) | static t_int64 parse_int_or_time(const char * ptr)
      method filter_node_mathop (line 380) | explicit filter_node_mathop(const char * p_left,const char * p_right...
      method test (line 387) | bool test(const file_info * item,const metadb_handle_ptr & handle) c...
    function filter_node_cptr (line 412) | static filter_node_cptr operator_handler_mathop(const parser & token_l...
    function filter_node_cptr (line 418) | static filter_node_cptr operator_handler_greater(const parser & token_...
    function filter_node_cptr (line 423) | static filter_node_cptr operator_handler_less(const parser & token_lef...
    function filter_node_cptr (line 428) | static filter_node_cptr operator_handler_equal(const parser & token_le...
    type operator_desc (line 433) | struct operator_desc
      method test_name (line 439) | bool test_name(const char * ptr,t_size len) const
    function has_operators (line 468) | static bool has_operators(const char * src) {
    type token_info (line 486) | struct token_info {
      method token_info (line 488) | token_info() {}
      method token_info (line 489) | token_info(t_size p_ptr,t_size p_len) : ptr(p_ptr), len(p_len) {}
    function t_size (line 492) | static t_size test_operator(const char * ptr,t_size len) {
    function is_operator (line 500) | static bool is_operator(const char * ptr,t_size len) {return test_oper...
    function filter_node_cptr (line 502) | filter_node_cptr filter_node::g_create(const parser & p_parser,bool b_...
    function filter_node_cptr (line 584) | filter_node_cptr filter_node::g_create(const char * ptr,t_size len,boo...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/search_filter.h
  function namespace (line 1) | namespace search_tools {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/seekabilizer.cpp
  function t_size (line 64) | t_size seekabilizer_backbuffer::get_depth() const
  function t_size (line 69) | t_size seekabilizer_backbuffer::get_max_depth() const
  function t_size (line 95) | t_size seekabilizer::read(void * p_buffer,t_size p_bytes,abort_callback ...
  function t_filesize (line 150) | t_filesize seekabilizer::get_size(abort_callback & p_abort) {
  function t_filesize (line 155) | t_filesize seekabilizer::get_position(abort_callback & p_abort) {
  function t_filetimestamp (line 200) | t_filetimestamp seekabilizer::get_timestamp(abort_callback & p_abort) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/seekabilizer.h
  function class (line 1) | class seekabilizer_backbuffer
  function class (line 15) | class seekabilizer : public file_readonly {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/stream_buffer_helper.cpp
  function t_size (line 10) | t_size stream_reader_buffered::read(void * p_buffer,t_size p_bytes,abort...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/stream_buffer_helper.h
  function class (line 1) | class stream_reader_buffered : public stream_reader
  function class (line 12) | class stream_writer_buffered : public stream_writer

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/string_filter.h
  function class (line 1) | class string_filter_noncasesensitive {
  function test (line 7) | bool test(const char * p_string,t_size p_string_len = infinite) const {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/text_file_loader.cpp
  type text_file_loader (line 5) | namespace text_file_loader
    function write (line 7) | void write(const service_ptr_t<file> & p_file,abort_callback & p_abort...
    function read (line 23) | void read(const service_ptr_t<file> & p_file,abort_callback & p_abort,...
    function write (line 86) | void write(const char * p_path,abort_callback & p_abort,const char * p...
    function read (line 93) | void read(const char * p_path,abort_callback & p_abort,pfc::string_bas...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/text_file_loader.h
  function namespace (line 1) | namespace text_file_loader

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/wildcard.cpp
  function test_recur (line 3) | static bool test_recur(const char * fn,const char * rm,bool b_sep)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/wildcard.h
  function namespace (line 4) | namespace wildcard_helper

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/win32_dialog.cpp
  type dialog_helper (line 4) | namespace dialog_helper {
    function INT_PTR (line 7) | INT_PTR CALLBACK dialog::DlgProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
    function HWND (line 40) | HWND dialog::run_modeless(unsigned id,HWND parent)
    function INT_PTR (line 83) | INT_PTR CALLBACK dialog_modal::DlgProc(HWND wnd,UINT msg,WPARAM wp,LPA...
    function BOOL (line 153) | BOOL dialog_modeless::on_message_wrap(UINT msg,WPARAM wp,LPARAM lp)
    function INT_PTR (line 161) | INT_PTR CALLBACK dialog_modeless::DlgProc(HWND wnd,UINT msg,WPARAM wp,...
    function INT_PTR (line 222) | INT_PTR CALLBACK dialog_modeless_v2::DlgProc(HWND wnd,UINT msg,WPARAM ...
    function BOOL (line 257) | BOOL dialog_modeless_v2::on_message_internal(UINT msg,WPARAM wp,LPARAM...

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/win32_dialog.h
  function namespace (line 5) | namespace dialog_helper
  function class (line 35) | class dialog_modal
  function class (line 67) | class dialog_modeless
  function class (line 95) | class dialog_modeless_v2

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/win32_misc.cpp
  class clipboard_scope (line 30) | class clipboard_scope {
    method clipboard_scope (line 32) | clipboard_scope() : m_open(false) {}
    method open (line 34) | bool open(HWND p_owner) {
    method close (line 43) | void close() {
  function uGetClipboardString (line 53) | bool uGetClipboardString(pfc::string_base & p_out) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/win32_misc.h
  function class (line 1) | class registerclass_scope_delayed {
  function m_object (line 27) | m_object(p_source) {}
  function t_object (line 71) | t_object peek() const {insync(m_sync); return m_object;}
  function t_object (line 83) | t_object get() {
  function class (line 102) | class CGlobalLock {
  function class (line 121) | class CMenuSelectionReceiver : public CWindowImpl<CMenuSelectionReceiver> {
  type CWindowImpl (line 130) | typedef CWindowImpl<CMenuSelectionReceiver> _baseClass;
  function MESSAGE_HANDLER (line 133) | BEGIN_MSG_MAP(CMenuSelectionReceiver)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/window_placement_helper.cpp
  function g_is_enabled (line 3) | static bool g_is_enabled()
  function BOOL (line 8) | static BOOL CALLBACK __MonitorEnumProc(
  function test_rect (line 21) | static bool test_rect(const RECT * rc) {
  function BOOL (line 121) | static BOOL SetWindowSize(HWND p_wnd,unsigned p_x,unsigned p_y)

FILE: plugins/foobar09/foobar_sdk/foobar2000/helpers/window_placement_helper.h
  function class (line 4) | class cfg_window_placement : public cfg_var
  function class (line 18) | class cfg_window_size : public cfg_var

FILE: plugins/foobar09/foobar_sdk/foobar2000/shared/audio_math.h
  type audio_sample (line 12) | typedef float audio_sample;
  type audio_sample (line 15) | typedef double audio_sample;
  function namespace (line 23) | namespace audio_math

FILE: plugins/foobar09/foobar_sdk/foobar2000/shared/shared.h
  function virtual (line 120) | virtual ~uGetOpenFileNameMultiResult() {}
  type uGetOpenFileNameMultiResult (line 123) | typedef uGetOpenFileNameMultiResult * puGetOpenFileNameMultiResult;
  function class (line 127) | class NOVTABLE uFindFile
  type uFindFile (line 143) | typedef uFindFile * puFindFile;
  type TVINSERTSTRUCTA (line 178) | typedef TVINSERTSTRUCTA uTVINSERTSTRUCT;
  type TCITEMA (line 198) | typedef TCITEMA uTCITEM;
  function uPrintf (line 221) | static inline void uPrintf(pfc::string_base & out,const char * fmt,...) ...
  function class (line 224) | class NOVTABLE uResource
  type uResource (line 232) | typedef uResource* puResource;
  function class (line 254) | class string_utf8_from_window
  function class (line 276) | class critical_section {
  function class (line 307) | class c_insync
  function class (line 320) | class critical_section2	//smarter version, has try_enter()
  function class (line 350) | class c_insync2
  function WNDPROC (line 383) | static WNDPROC uHookWindowProc(HWND p_wnd,WNDPROC p_proc) {return __uHoo...
  function class (line 396) | class string_print_crash
  function t_size (line 402) | inline t_size length() {return strlen(block);}
  function class (line 406) | class uStringPrintf
  function LRESULT (line 425) | inline LRESULT uButton_SetCheck(HWND wnd,UINT id,bool state) {return uSe...
  function uButton_GetCheck (line 426) | inline bool uButton_GetCheck(HWND wnd,UINT id) {return uSendDlgItemMessa...
  function class (line 428) | class uCallStackTracker
  function class (line 464) | class comparator_stricmp_utf8 {
  function t_size (line 472) | inline t_size uReplaceString(pfc::string_base & out,const char * src,t_s...
  function t_size (line 478) | inline t_size uReplaceChar(pfc::string_base & out,const char * src,t_siz...
  function class (line 484) | class string_lower
  function class (line 496) | class string_upper
  function UINT (line 508) | inline UINT char_lower(UINT c) {return uCharLower(c);}
  function UINT (line 509) | inline UINT char_upper(UINT c) {return uCharUpper(c);}
  function BOOL (line 511) | inline BOOL uGetLongPathNameEx(const char * name,pfc::string_base & out)
  type t_font_description (line 517) | struct t_font_description
  type t_modal_dialog_entry (line 538) | struct t_modal_dialog_entry
  function class (line 554) | class modal_dialog_scope {
  function modal_dialog_scope (line 559) | inline modal_dialog_scope() : m_initialized(false) {}
  function poke_existing (line 566) | inline static void poke_existing() {ModalDialog_PokeExisting();}
  function initialize (line 569) | void initialize(HWND p_wnd)
  function deinitialize (line 580) | void deinitialize()
  function class (line 600) | class format_win32_error {
  type exception_win32 (line 612) | struct exception_win32
  function class (line 620) | class uDebugLog : public pfc::string_formatter {
  function uAddWindowStyle (line 625) | static void uAddWindowStyle(HWND p_wnd,LONG p_style) {
  function uRemoveWindowStyle (line 629) | static void uRemoveWindowStyle(HWND p_wnd,LONG p_style) {
  function uAddWindowExStyle (line 633) | static void uAddWindowExStyle(HWND p_wnd,LONG p_style) {
  function uRemoveWindowExStyle (line 637) | static void uRemoveWindowExStyle(HWND p_wnd,LONG p_style) {
  function MapDialogWidth (line 641) | static unsigned MapDialogWidth(HWND p_dialog,unsigned p_value) {
  function IsKeyPressed (line 648) | static bool IsKeyPressed(unsigned vk) {

FILE: plugins/foobar09/foobar_sdk/foobar2000/shared/win32_misc.h
  function class (line 1) | class win32_menu {
  function class (line 30) | class win32_font {
  function class (line 61) | class win32_event {
  function uSleepSeconds (line 127) | static void uSleepSeconds(double p_time,bool p_alertable) {
  function class (line 134) | class win32_icon {
  function class (line 158) | class win32_accelerator {
  function class (line 185) | class SelectObjectScope {

FILE: plugins/foobar09/foobar_sdk/pfc/alloc.h
  function namespace (line 1) | namespace pfc {
  function set_size (line 62) | void set_size(t_size p_size) {throw pfc::exception_not_implemented();}
  function t_size (line 63) | t_size get_size() const {throw pfc::exception_not_implemented();}
  function is_ptr_owned (line 67) | bool is_ptr_owned(const void * p_item) const {return false;}
  function t_item (line 70) | const t_item * get_ptr() const {throw pfc::exception_not_implemented();}
  function t_item (line 71) | t_item * get_ptr() {throw pfc::exception_not_implemented();}
  function prealloc (line 72) | void prealloc(t_size) {throw pfc::exception_not_implemented();}
  function force_reset (line 73) | void force_reset() {throw pfc::exception_not_implemented();}
  function set_size (line 90) | void set_size(t_size p_size) {
  function t_item (line 106) | const t_item & operator[](t_size p_index) const {PFC_ASSERT(p_index < m_...
  function is_ptr_owned (line 108) | bool is_ptr_owned(const void * p_item) const {return is_pointer_in_range...
  function t_item (line 110) | t_item * get_ptr() {return m_data;}
  function t_item (line 111) | const t_item * get_ptr() const {return m_data;}
  function prealloc (line 113) | void prealloc(t_size) {}
  function force_reset (line 114) | void force_reset() {set_size(0);}
  function set_size (line 132) | void set_size(t_size p_size,t_size p_size_total) {
  function t_item (line 148) | const t_item & operator[](t_size p_index) const {PFC_ASSERT(p_index < m_...
  function t_item (line 153) | t_item * get_ptr() {return m_buffer;}
  function t_item (line 154) | const t_item * get_ptr() const {return m_buffer;}
  function is_ptr_owned (line 155) | bool is_ptr_owned(const void * p_item) const {return is_pointer_in_range...
  function resize_content (line 161) | void resize_content(t_size p_size) {
  function resize_storage (line 177) | void resize_storage(t_size p_size) {
  function set_size (line 211) | void set_size(t_size p_size) {m_content.set_size(p_size,p_size);}
  function t_item (line 215) | const t_item & operator[](t_size p_index) const {return m_content[p_inde...
  function t_item (line 218) | const t_item * get_ptr() const {return m_content.get_ptr();}
  function t_item (line 219) | t_item * get_ptr() {return m_content.get_ptr();}
  function is_ptr_owned (line 221) | bool is_ptr_owned(const void * p_item) const {return m_content.is_ptr_ow...
  function prealloc (line 222) | void prealloc(t_size p_size) {}
  function force_reset (line 223) | void force_reset() {set_size(0);}
  function set_size (line 236) | void set_size(t_size p_size) {
  function t_item (line 249) | const t_item & operator[](t_size p_index) const {return m_data[p_index];}
  function t_item (line 252) | const t_item * get_ptr() const {return m_data.get_ptr();}
  function t_item (line 253) | t_item * get_ptr() {return m_data.get_ptr();}
  function is_ptr_owned (line 254) | bool is_ptr_owned(const void * p_item) const {return m_data.is_ptr_owned...
  function prealloc (line 255) | void prealloc(t_size) {}
  function force_reset (line 256) | void force_reset() {m_data.set_size(0,0);}
  function set_size (line 268) | void set_size(t_size p_size) {
  function prealloc (line 277) | void prealloc(t_size p_size) {
  function t_item (line 289) | const t_item & operator[](t_size p_index) const {;return m_data[p_index];}
  function t_item (line 292) | const t_item * get_ptr() const {return m_data.get_ptr();}
  function t_item (line 293) | t_item * get_ptr() {return m_data.get_ptr();}
  function is_ptr_owned (line 294) | bool is_ptr_owned(const void * p_item) const {return m_data.is_ptr_owned...
  function force_reset (line 295) | void force_reset() {m_data.set_size(0,0);}
  function set_size (line 309) | void set_size(t_size p_size) {
  function t_item (line 328) | t_item * get_ptr() {return reinterpret_cast<t_item*>(&m_array);}
  function t_item (line 329) | const t_item * get_ptr() const {return reinterpret_cast<const t_item*>(&...
  function t_item (line 331) | const t_item & operator[](t_size n) const {return get_ptr()[n];}
  function is_ptr_owned (line 333) | bool is_ptr_owned(const void * p_item) const {return is_pointer_in_range...
  function prealloc (line 334) | void prealloc(t_size) {}
  function force_reset (line 335) | void force_reset() {set_size(0);}
  function set_size (line 352) | void set_size(t_size p_size) {
  function t_item (line 368) | const t_item & operator[](t_size p_index) const {
  function is_ptr_owned (line 375) | bool is_ptr_owned(const void * p_item) const {return m_fixed.is_ptr_owne...
  function prealloc (line 376) | void prealloc(t_size p_size) {
  function force_reset (line 379) | void force_reset() {

FILE: plugins/foobar09/foobar_sdk/pfc/array.h
  function namespace (line 4) | namespace pfc {
  function set_size_discard (line 36) | void set_size_discard(t_size p_size) {
  function t_item (line 45) | const t_item * get_ptr() const {return m_array;}
  function t_item (line 46) | t_item * get_ptr() {return m_array;}
  function t_item (line 48) | const t_item & operator[](t_size p_index) const {PFC_ASSERT(p_index < ge...
  function set_size (line 92) | void set_size(t_size p_size) {m_alloc.set_size(p_size);}
  function set_count (line 93) | void set_count(t_size p_count) {m_alloc.set_size(p_count);}
  function force_reset (line 96) | void force_reset() {m_alloc.force_reset();}
  function t_item (line 98) | const t_item & operator[](t_size p_index) const {PFC_ASSERT(p_index < ge...
  function increase_size (line 129) | void increase_size(t_size p_delta) {
  function fill_null (line 151) | void fill_null() {
  function grow_size (line 156) | void grow_size(t_size p_size) {
  function t_item (line 161) | const t_item * get_ptr() const {return m_alloc.get_ptr();}
  function t_item (line 162) | t_item * get_ptr() {return m_alloc.get_ptr();}
  function prealloc (line 164) | void prealloc(t_size p_size) {m_alloc.prealloc(p_size);}
  function compare (line 212) | int compare(const t_array1 & p_array1, const t_array2 & p_array2) {

FILE: plugins/foobar09/foobar_sdk/pfc/avltree.h
  function namespace (line 4) | namespace pfc {
  function t_storage (line 345) | t_storage * find_ptr(t_item const & p_item) const {return find_item_ptr(...
  function reset (line 348) | void reset() {remove_all();}
  function __copy (line 364) | void __copy(const t_self & p_other) {

FILE: plugins/foobar09/foobar_sdk/pfc/bit_array.h
  function class (line 4) | class NOVTABLE bit_array {
  function t_size (line 27) | inline t_size find_first(bool val,t_size start,t_size max) const {return...
  function t_size (line 28) | inline t_size find_next(bool val,t_size previous,t_size max) const {retu...

FILE: plugins/foobar09/foobar_sdk/pfc/bit_array_impl.h
  function set (line 40) | void set(t_size n,bool val) {
  type bit_array_table_t (line 46) | typedef bit_array_table_t<bool> bit_array_table;
  type bit_array_var_table_t (line 47) | typedef bit_array_var_table_t<bool> bit_array_var_table;
  function class (line 49) | class bit_array_range : public bit_array
  function class (line 64) | class bit_array_and : public bit_array
  function class (line 72) | class bit_array_or : public bit_array
  function class (line 80) | class bit_array_xor : public bit_array
  function class (line 92) | class bit_array_not : public bit_array
  function class (line 103) | class bit_array_true : public bit_array
  function class (line 111) | class bit_array_false : public bit_array
  function class (line 119) | class bit_array_val : public bit_array
  function class (line 129) | class bit_arr
Copy disabled (too large) Download .json
Condensed preview — 964 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,920K chars).
[
  {
    "path": ".gitignore",
    "chars": 202,
    "preview": "_build/\n_files.qmake\n_build_parameters.pl.h\nMakefile*\n/_bin/\n/_include/\nadmin/dist/mac/dsa_priv.pem\n*.idb\n*.pdb\n*.ncb\n*."
  },
  {
    "path": ".gitmodules",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "COPYING",
    "chars": 32472,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "Last.fm.pro",
    "chars": 501,
    "preview": "TEMPLATE = subdirs\nCONFIG += ordered\nSUBDIRS = lib/logger \\\n          lib/unicorn \\\n          lib/listener \\\n          i"
  },
  {
    "path": "README.md",
    "chars": 4896,
    "preview": "Join us for chats on IRC!\n\nServer: irc.last.fm\nChannel: #last.desktop\n\n# Build Dependencies\n\n* Qt >= 4.8 (http://downloa"
  },
  {
    "path": "admin/Doxyfile",
    "chars": 65621,
    "preview": "# Doxyfile 1.6.1\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) "
  },
  {
    "path": "admin/dist/mac/AppleScriptSuite.sdef",
    "chars": 2175,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE dictionary SYSTEM \"file://localhost/System/Library/DTDs/sdef.dtd\">\n<dic"
  },
  {
    "path": "admin/dist/mac/Growl Registration Ticket.growlRegDict",
    "chars": 386,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">\n<"
  },
  {
    "path": "admin/dist/mac/Standard.plist",
    "chars": 1884,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "admin/dist/mac/build-release.rb",
    "chars": 6281,
    "preview": "### Usage build-release.rb --deltas <version> <version> [--no-build] [--no-package]\n# the deltas should be in a zip in t"
  },
  {
    "path": "admin/dist/mac/bundleFrameworks.sh",
    "chars": 6790,
    "preview": "#!/bin/bash\n# Author: Jono Cole <jono@last.fm>\n#\n# A tool for distributing Mac OSX bundles.\n#\n# Finds and copies dependa"
  },
  {
    "path": "admin/dist/mac/dsa_pub.pem",
    "chars": 1182,
    "preview": "-----BEGIN PUBLIC KEY-----\nMIIDPDCCAi4GByqGSM44BAEwggIhAoIBAQDagjvSe6+JNNvHjB6aWriA6YXnVdqS\ns//YkmhwiCwkHGk0set/4P4IZbl2"
  },
  {
    "path": "admin/dist/mac/sign_update.rb",
    "chars": 257,
    "preview": "#!/usr/bin/ruby\nif ARGV.length < 2\n  puts \"Usage: ruby sign_update.rb update_archive private_key\"\n  exit\nend\nopenssl = \""
  },
  {
    "path": "admin/dist/updates/Changelog.txt",
    "chars": 383,
    "preview": "The changelog is publicly places into the update files, which live on cdn.last.fm. Add your changes there.\n\nNote that bu"
  },
  {
    "path": "admin/dist/updates/Mac/updates.xml",
    "chars": 32444,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/updates/Win/updates.xml",
    "chars": 23428,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/updates/updates.html",
    "chars": 7280,
    "preview": "<html>\n  <head>\n    <title>Last.fm Scrobbler Changelog</title>\n    <style type=\"text/css\">\n\n      html {\n        backgro"
  },
  {
    "path": "admin/dist/updates/updates.linux.xml",
    "chars": 17605,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/updates/updates.mac.beta.xml",
    "chars": 33835,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/updates/updates.mac.xml",
    "chars": 32445,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/updates/updates.win.beta.xml",
    "chars": 23446,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/updates/updates.win.xml",
    "chars": 23436,
    "preview": "<rss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elem"
  },
  {
    "path": "admin/dist/win/Last.fm.iss",
    "chars": 17935,
    "preview": "; Script generated by the Inno Setup Script Wizard.\r\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT F"
  },
  {
    "path": "admin/dist/win/build-release-win.pl",
    "chars": 3592,
    "preview": "#!/usr/bin/perl\r\n#\r\n# brief: This script builds a release build from scratch and packages it\r\n#        into an installer"
  },
  {
    "path": "admin/dist/win/isspp",
    "chars": 489,
    "preview": "use File::Copy;\n\nopen FILE, '_build/build_parameters.pl.h' or die $!;\nwhile ($line = <FILE>) {\n    $str .= $line;\n}\neval"
  },
  {
    "path": "admin/dist/win/wix/boffin.wxs",
    "chars": 7303,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\n  <Product\n\t\tId=\"C57A8E40-"
  },
  {
    "path": "admin/dist/win/wix/client.wxs",
    "chars": 8855,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\">\r\n\t<Product \r\n    Id=\"AC9C"
  },
  {
    "path": "admin/dist/win/wix/qt.conf",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "admin/dist/win/wix/wixboff.cmd",
    "chars": 583,
    "preview": "rem @echo off\nrem Requires Wix 3.0.x\nrem Run with current directory same as .cmd location\n\nrem set VCREDISTDIR=C:\\Progra"
  },
  {
    "path": "admin/dist/win/wix/wixclient.cmd",
    "chars": 619,
    "preview": "@echo off\r\nrem Requires Wix 3.0.x\r\nrem Run with current directory same as .cmd location\r\n\r\nrem set VCREDISTDIR=C:\\Progra"
  },
  {
    "path": "admin/include.qmake",
    "chars": 4929,
    "preview": "\nROOT_DIR = $$PWD/..\n\nmacx-xcode {\n    BUILD_DIR = _build\n} else {\n    # With Xcode we generate a bundle\n    BUILD_DIR ="
  },
  {
    "path": "admin/qmake/1stparty.pro.inc",
    "chars": 1134,
    "preview": "CONFIG( unicorn ) {\n    LIBS += -lunicorn\n    QT += gui\n    CONFIG += lastfm\n}\nCONFIG( listener ) {\n    LIBS += -llisten"
  },
  {
    "path": "admin/qmake/3rdparty.pro.inc",
    "chars": 2164,
    "preview": "mac {\n    LIBS += -L/usr/local/lib\n    INCLUDEPATH += /usr/local/include\n}\n\nCONFIG( taglib ) {\n    CONFIG += link_pkgcon"
  },
  {
    "path": "admin/qmake/QtOverride.pro.inc",
    "chars": 181,
    "preview": "!CONFIG( no_override ) {\n    win32:QMAKE_INCDIR_QT = $$ROOT_DIR/common/qt/override $$QMAKE_INCDIR_QT\n    else:!macx-xcod"
  },
  {
    "path": "admin/qmake/debug.pro.inc",
    "chars": 309,
    "preview": "CONFIG( debug, debug|release ) {\n    mac* {\n        #speeds up debug builds by only compiling x86\n        CONFIG -= ppc\n"
  },
  {
    "path": "admin/tests/QtTest_to_JUnit.xslt",
    "chars": 3602,
    "preview": "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n\n<xsl:output method=\"xml\" indent=\"yes\" /"
  },
  {
    "path": "admin/tests/log_test.sh",
    "chars": 1058,
    "preview": "#!/bin/bash\n# author <pete@last.fm>\n# meant to be run from the /tests dir\n\nRUNDIR=`pwd`\nmkdir $RUNDIR/output\n\nTOTERRORS="
  },
  {
    "path": "admin/tests/run_tests.sh",
    "chars": 446,
    "preview": "#!/bin/bash\n# @author <max@last.fm>\n# expects to located in _bin, otherwise it doesn't work\n\nd=`dirname $0`\n\nsource $d/."
  },
  {
    "path": "app/boffin/App.cpp",
    "chars": 12427,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/App.h",
    "chars": 2746,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/HistoryWidget.cpp",
    "chars": 1818,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/HistoryWidget.h",
    "chars": 1335,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/Info.plist.in",
    "chars": 1364,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
  },
  {
    "path": "app/boffin/LocalCollectionScanner.cpp",
    "chars": 3081,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n\n   This file is part of the Last.fm Desktop Application Suite.\n\n   lastfm-deskt"
  },
  {
    "path": "app/boffin/LocalCollectionScanner.h",
    "chars": 1580,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n\n   This file is part of the Last.fm Desktop Application Suite.\n\n   lastfm-deskt"
  },
  {
    "path": "app/boffin/MainWindow.cpp",
    "chars": 2942,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/MainWindow.h",
    "chars": 1438,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/MediaPipeline.cpp",
    "chars": 7216,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/MediaPipeline.h",
    "chars": 1884,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PickDirsDialog.cpp",
    "chars": 3584,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PickDirsDialog.h",
    "chars": 1272,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaydarHostsModel.cpp",
    "chars": 1281,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaydarHostsModel.h",
    "chars": 1283,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaydarTagCloudModel.cpp",
    "chars": 5750,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaydarTagCloudModel.h",
    "chars": 3026,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/Playlist.cpp",
    "chars": 1361,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/Playlist.h",
    "chars": 1373,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaylistModel.cpp",
    "chars": 2939,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaylistModel.h",
    "chars": 1783,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/PlaylistWidget.h",
    "chars": 1741,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/ScanProgressWidget.cpp",
    "chars": 6202,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/ScanProgressWidget.h",
    "chars": 2248,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/ScrobSocket.cpp",
    "chars": 3551,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/ScrobSocket.h",
    "chars": 1583,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/Shuffler.cpp",
    "chars": 7221,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/Shuffler.h",
    "chars": 2328,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/TagBrowserWidget.cpp",
    "chars": 4285,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/TagBrowserWidget.h",
    "chars": 8978,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/TagCloudView.cpp",
    "chars": 8088,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/TagCloudView.h",
    "chars": 2544,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/TagDelegate.cpp",
    "chars": 3797,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/TagDelegate.h",
    "chars": 1249,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/TrackSource.cpp",
    "chars": 2170,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/TrackSource.h",
    "chars": 1613,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/WordleDialog.h",
    "chars": 2448,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/XspfDialog.cpp",
    "chars": 4406,
    "preview": "/***************************************************************************\n *   Copyright 2009 Last.fm Ltd.           "
  },
  {
    "path": "app/boffin/XspfDialog.h",
    "chars": 2045,
    "preview": "/***************************************************************************\n *   Copyright 2009 Last.fm Ltd.           "
  },
  {
    "path": "app/boffin/XspfReader.cpp",
    "chars": 2252,
    "preview": "/***************************************************************************\n *   Copyright 2005-2009 Last.fm Ltd.      "
  },
  {
    "path": "app/boffin/XspfReader.h",
    "chars": 1776,
    "preview": "/***************************************************************************\n *   Copyright 2005-2009 Last.fm Ltd.      "
  },
  {
    "path": "app/boffin/boffin.pro",
    "chars": 2429,
    "preview": "CONFIG += unicorn boost yajl\nQT += opengl sql phonon\nVERSION = 1.0.0\nDEFINES += LASTFM_COLLAPSE_NAMESPACE\n\ninclude( $$RO"
  },
  {
    "path": "app/boffin/comet/CometParser.cpp",
    "chars": 4114,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/comet/CometParser.h",
    "chars": 3154,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/comet/YajlCallbacks.hpp",
    "chars": 2924,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/json_spirit/README",
    "chars": 80,
    "preview": "json spirit v3.0\nFrom:\nhttp://www.codeproject.com/KB/recipes/JSON_Spirit.aspx\n\n\n"
  },
  {
    "path": "app/boffin/json_spirit/json_spirit.h",
    "chars": 409,
    "preview": "#ifndef JASON_SPIRIT\n#define JASON_SPIRIT\n\n/* Copyright (c) 2007-2009 John W Wilkinson\n\n   This source code can be used "
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_reader.cpp",
    "chars": 19619,
    "preview": "/* Copyright (c) 2007-2009 John W Wilkinson\n\n   This source code can be used for any purpose as long as\n   this comment "
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_reader.h",
    "chars": 1902,
    "preview": "#ifndef JASON_SPIRIT_READER\n#define JASON_SPIRIT_READER\n\n/* Copyright (c) 2007-2009 John W Wilkinson\n\n   json spirit ver"
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_utils.h",
    "chars": 1656,
    "preview": "#ifndef JASON_SPIRIT_UTILS\n#define JASON_SPIRIT_UTILS\n\n/* Copyright (c) 2007-2009 John W Wilkinson\n\n   This source code "
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_value.cpp",
    "chars": 192,
    "preview": "/* Copyright (c) 2007 John W Wilkinson\n\n   This source code can be used for any purpose as long as\n   this comment is re"
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_value.h",
    "chars": 11177,
    "preview": "#ifndef JASON_SPIRIT_VALUE\n#define JASON_SPIRIT_VALUE\n\n/* Copyright (c) 2007-2009 John W Wilkinson\n\n   This source code "
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_writer.cpp",
    "chars": 7529,
    "preview": "/* Copyright (c) 2007-2009 John W Wilkinson\n\n   This source code can be used for any purpose as long as\n   this comment "
  },
  {
    "path": "app/boffin/json_spirit/json_spirit_writer.h",
    "chars": 1078,
    "preview": "#ifndef JASON_SPIRIT_WRITER\n#define JASON_SPIRIT_WRITER\n\n/* Copyright (c) 2007-2009 John W Wilkinson\n\n   This source cod"
  },
  {
    "path": "app/boffin/layouts/SideBySideLayout.cpp",
    "chars": 4530,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/layouts/SideBySideLayout.h",
    "chars": 2135,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/main.cpp",
    "chars": 1247,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/playdar/BoffinPlayableItem.cpp",
    "chars": 2600,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/BoffinPlayableItem.h",
    "chars": 2743,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/BoffinRqlRequest.cpp",
    "chars": 2089,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/BoffinRqlRequest.h",
    "chars": 1444,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/BoffinTagRequest.cpp",
    "chars": 2485,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/BoffinTagRequest.h",
    "chars": 2135,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/CometRequest.cpp",
    "chars": 1391,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/CometRequest.h",
    "chars": 1203,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarApi.h",
    "chars": 1461,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is "
  },
  {
    "path": "app/boffin/playdar/PlaydarAuthRequest.cpp",
    "chars": 3407,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarAuthRequest.h",
    "chars": 1427,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarCometRequest.cpp",
    "chars": 2393,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarCometRequest.h",
    "chars": 1584,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarConnection.cpp",
    "chars": 6942,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarConnection.h",
    "chars": 2545,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarRosterRequest.cpp",
    "chars": 2368,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarRosterRequest.h",
    "chars": 1353,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarStatRequest.cpp",
    "chars": 2808,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/PlaydarStatRequest.h",
    "chars": 1530,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/TPlaydarApi.hpp",
    "chars": 5013,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/TrackResolveRequest.cpp",
    "chars": 2174,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/TrackResolveRequest.h",
    "chars": 1490,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/jsonGetMember.cpp",
    "chars": 1897,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/boffin/playdar/jsonGetMember.h",
    "chars": 2024,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/boffin/qrc/boffin.qrc",
    "chars": 138,
    "preview": "<RCC>\n  <qresource>\n    <file>pause.png</file>\n\t<file>play.png</file>\n\t<file>skip.png</file>\n\t<file>stop.png</file>\n  </"
  },
  {
    "path": "app/boffin/sample/SampleFromDistribution.h",
    "chars": 3743,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This file is"
  },
  {
    "path": "app/client/Application.cpp",
    "chars": 23691,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd. \n      - Primarily authored by Jono Cole and Michael Coffey\n\n   This file is part"
  },
  {
    "path": "app/client/Application.h",
    "chars": 6130,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/AudioscrobblerSettings.cpp",
    "chars": 1969,
    "preview": "/*\n   Copyright 2005-2011 Last.fm Ltd.\n      - Primarily authored by Jono Cole and Michael Coffey\n\n   This file is part "
  },
  {
    "path": "app/client/AudioscrobblerSettings.h",
    "chars": 1360,
    "preview": "/*\n   Copyright 2005-2011 Last.fm Ltd.\n      - Primarily authored by Jono Cole and Michael Coffey\n\n   This file is part "
  },
  {
    "path": "app/client/Bootstrapper/AbstractBootstrapper.cpp",
    "chars": 5395,
    "preview": "/***************************************************************************\n*   Copyright (C) 2005 - 2007 by           "
  },
  {
    "path": "app/client/Bootstrapper/AbstractBootstrapper.h",
    "chars": 2700,
    "preview": "/**************************************************************************\n*   Copyright (C) 2005 - 2007 by            "
  },
  {
    "path": "app/client/Bootstrapper/AbstractFileBootstrapper.cpp",
    "chars": 4687,
    "preview": "/**************************************************************************\n*   Copyright (C) 2005 - 2007 by            "
  },
  {
    "path": "app/client/Bootstrapper/AbstractFileBootstrapper.h",
    "chars": 2553,
    "preview": "/**************************************************************************\n*   Copyright (C) 2005 - 2007 by            "
  },
  {
    "path": "app/client/Bootstrapper/ITunesDevice/ITunesParser.h",
    "chars": 5593,
    "preview": "/***************************************************************************\n *   Copyright 2005 - 2008 Last.fm Ltd.    "
  },
  {
    "path": "app/client/Bootstrapper/ITunesDevice/MediaDeviceInterface.h",
    "chars": 2623,
    "preview": "/***************************************************************************\n *   Copyright (C) 2005 - 2007 by          "
  },
  {
    "path": "app/client/Bootstrapper/ITunesDevice/itunesdevice.cpp",
    "chars": 6809,
    "preview": "/***************************************************************************\n *   Copyright 2005 - 2008 Last.fm Ltd.    "
  },
  {
    "path": "app/client/Bootstrapper/ITunesDevice/itunesdevice.h",
    "chars": 2339,
    "preview": "/***************************************************************************\n *   Copyright 2005 - 2008 Last.fm Ltd.    "
  },
  {
    "path": "app/client/Bootstrapper/PluginBootstrapper.cpp",
    "chars": 5906,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Bootstrapper/PluginBootstrapper.h",
    "chars": 1281,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Bootstrapper/iTunesBootstrapper.cpp",
    "chars": 2281,
    "preview": "/***************************************************************************\n*   Copyright (C) 2005 - 2007 by           "
  },
  {
    "path": "app/client/Bootstrapper/iTunesBootstrapper.h",
    "chars": 1944,
    "preview": "/***************************************************************************\n*   Copyright (C) 2005 - 2007 by           "
  },
  {
    "path": "app/client/CommandReciever/CommandReciever.h",
    "chars": 1736,
    "preview": "/*\n   Copyright 2011 Last.fm Ltd.\n      - Primarily authored by Michael Coffey\n\n   This file is part of the Last.fm Desk"
  },
  {
    "path": "app/client/CommandReciever/CommandReciever.mm",
    "chars": 5708,
    "preview": "/*\n   Copyright 2011 Last.fm Ltd.\n      - Primarily authored by Michael Coffey\n\n   This file is part of the Last.fm Desk"
  },
  {
    "path": "app/client/Dialogs/BetaDialog.cpp",
    "chars": 2127,
    "preview": "/*\n   Copyright 2012 Last.fm Ltd.\n      - Primarily authored by Michael Coffey\n\n   This file is part of the Last.fm Desk"
  },
  {
    "path": "app/client/Dialogs/BetaDialog.h",
    "chars": 1127,
    "preview": "/*\n   Copyright 2012 Last.fm Ltd.\n      - Primarily authored by Michael Coffey\n\n   This file is part of the Last.fm Desk"
  },
  {
    "path": "app/client/Dialogs/BetaDialog.ui",
    "chars": 1397,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>BetaDialog</class>\n <widget class=\"QDialog\" name=\"Beta"
  },
  {
    "path": "app/client/Dialogs/DiagnosticsDialog.cpp",
    "chars": 7280,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Dialogs/DiagnosticsDialog.h",
    "chars": 2529,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Dialogs/DiagnosticsDialog.ui",
    "chars": 9144,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DiagnosticsDialog</class>\n <widget class=\"QDialog\" nam"
  },
  {
    "path": "app/client/Dialogs/LicensesDialog.cpp",
    "chars": 10292,
    "preview": "/*\n   Copyright 2012 Last.fm Ltd.\n      - Primarily authored by Michael Coffey\n\n   This file is part of the Last.fm Desk"
  },
  {
    "path": "app/client/Dialogs/LicensesDialog.h",
    "chars": 1116,
    "preview": "/*\n   Copyright 2012 Last.fm Ltd.\n      - Primarily authored by Michael Coffey\n\n   This file is part of the Last.fm Desk"
  },
  {
    "path": "app/client/Dialogs/LicensesDialog.ui",
    "chars": 851,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>LicensesDialog</class>\n <widget class=\"QDialog\" name=\""
  },
  {
    "path": "app/client/Fingerprinter/AacSource.cpp",
    "chars": 25883,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n   Portions Copyright 200"
  },
  {
    "path": "app/client/Fingerprinter/AacSource.h",
    "chars": 1440,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/AacSource_p.h",
    "chars": 3023,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/FlacSource.cpp",
    "chars": 11163,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/FlacSource.h",
    "chars": 2551,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/MadSource.cpp",
    "chars": 14597,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/MadSource.h",
    "chars": 2152,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/VorbisSource.cpp",
    "chars": 6166,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Fingerprinter/VorbisSource.h",
    "chars": 1498,
    "preview": "/*\n   Copyright 2009 Last.fm Ltd. \n   Copyright 2009 John Stamp <jstamp@users.sourceforge.net>\n\n   This file is part of "
  },
  {
    "path": "app/client/Last.fm Scrobbler.css",
    "chars": 36077,
    "preview": "\nSlidingStackedWidget {\n\tqproperty-speed: 200;\n\tqproperty-easingCurve: OutCirc;\n}\n\nFirstRunWizard {\n\tbackground-repeat: "
  },
  {
    "path": "app/client/MainWindow.cpp",
    "chars": 15818,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/MainWindow.h",
    "chars": 3891,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/MediaDevices/DeviceScrobbler.cpp",
    "chars": 16309,
    "preview": "/*\n   Copyright 2010-2012 Last.fm Ltd.\n      - Primarily authored by Jono Cole and Michael Coffey\n\n   This file is part "
  },
  {
    "path": "app/client/MediaDevices/DeviceScrobbler.h",
    "chars": 2714,
    "preview": "/*\n   Copyright 2010-2012 Last.fm Ltd.\n      - Primarily authored by Jono Cole and Michael Coffey\n\n   This file is part "
  },
  {
    "path": "app/client/MediaDevices/IpodDevice.cpp",
    "chars": 2829,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/MediaDevices/IpodDevice.h",
    "chars": 1523,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/MediaDevices/IpodDevice_linux.cpp",
    "chars": 9855,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/MediaDevices/IpodDevice_linux.h",
    "chars": 4088,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/MediaDevices/MediaDevice.cpp",
    "chars": 3295,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/MediaDevices/MediaDevice.h",
    "chars": 2323,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd.\n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fil"
  },
  {
    "path": "app/client/Mpris2/DBusAbstractAdaptor.cpp",
    "chars": 3666,
    "preview": "/*\n * Copyright 2012  Alex Merry <alex.merry@kdemail.net>\n *\n * Redistribution and use in source and binary forms, with "
  },
  {
    "path": "app/client/Mpris2/DBusAbstractAdaptor.h",
    "chars": 3197,
    "preview": "/*\n * Copyright 2012  Alex Merry <alex.merry@kdemail.net>\n *\n * Redistribution and use in source and binary forms, with "
  },
  {
    "path": "app/client/Mpris2/MediaPlayer2.cpp",
    "chars": 1543,
    "preview": "/*\n   Copyright (C) 2013 John Stamp <jstamp@mehercule.net>\n\n   This file is part of the Last.fm Desktop Application Suit"
  },
  {
    "path": "app/client/Mpris2/MediaPlayer2.h",
    "chars": 1726,
    "preview": "/*\n   Copyright (C) 2013 John Stamp <jstamp@mehercule.net>\n\n   This file is part of the Last.fm Desktop Application Suit"
  },
  {
    "path": "app/client/Mpris2/MediaPlayer2Player.cpp",
    "chars": 7622,
    "preview": "/*\n   Copyright (C) 2013 John Stamp <jstamp@mehercule.net>\n\n   This file is part of the Last.fm Desktop Application Suit"
  },
  {
    "path": "app/client/Mpris2/MediaPlayer2Player.h",
    "chars": 2888,
    "preview": "/*\n   Copyright (C) 2013 John Stamp <jstamp@mehercule.net>\n\n   This file is part of the Last.fm Desktop Application Suit"
  },
  {
    "path": "app/client/Mpris2/Mpris2.cpp",
    "chars": 2145,
    "preview": "/***********************************************************************\n * Copyright 2012  Eike Hein <hein@kde.org>\n *\n"
  },
  {
    "path": "app/client/Mpris2/Mpris2.h",
    "chars": 1240,
    "preview": "/***********************************************************************\n * Copyright 2012  Eike Hein <hein@kde.org>\n *\n"
  },
  {
    "path": "app/client/PrefPane/English.lproj/MainWindow.xib",
    "chars": 12802,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"7.03\">\n\t<data>\n\t\t<"
  },
  {
    "path": "app/client/PrefPane/FmLastPrefPane.h",
    "chars": 1035,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole\n\n   This file is part of the Last.fm Desktop A"
  },
  {
    "path": "app/client/PrefPane/FmLastPrefPanePrefWidget.h",
    "chars": 1174,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole\n\n   This file is part of the Last.fm Desktop A"
  },
  {
    "path": "app/client/PrefPane/FmLastPrefPanePrefWidget.mm",
    "chars": 3393,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole\n\n   This file is part of the Last.fm Desktop A"
  },
  {
    "path": "app/client/PrefPane/FmLastPrefPaneQtView.h",
    "chars": 1022,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole\n\n   This file is part of the Last.fm Desktop A"
  },
  {
    "path": "app/client/PrefPane/FmLastPrefPaneQtView.mm",
    "chars": 1623,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole\n\n   This file is part of the Last.fm Desktop A"
  },
  {
    "path": "app/client/PrefPane/Info.plist",
    "chars": 832,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "app/client/PrefPane/PrefPane.pro",
    "chars": 517,
    "preview": "TEMPLATE = app\n\ndebug {\n    pp.commands = xcodebuild -project PrefPane.xcodeproj -configuration Debug\n}\n\nrelease {\n    p"
  },
  {
    "path": "app/client/PrefPane/PrefPane.xcodeproj/project.pbxproj",
    "chars": 20339,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "app/client/PrefPane/PrefPane_prefix.pch",
    "chars": 791,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole\n\n   This file is part of the Last.fm Desktop A"
  },
  {
    "path": "app/client/ScrobSocket.cpp",
    "chars": 4331,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/ScrobSocket.h",
    "chars": 1684,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Services/AnalyticsService/AnalyticsService.cpp",
    "chars": 3480,
    "preview": "/*\n   Copyright 2005-2012 Last.fm Ltd.\n      - Primarily authored by Frantz Joseph\n\n   This file is part of the Last.fm "
  },
  {
    "path": "app/client/Services/AnalyticsService/AnalyticsService.h",
    "chars": 2514,
    "preview": "/*\n   Copyright 2005-2012 Last.fm Ltd.\n      - Primarily authored by Frantz Joseph\n\n   This file is part of the Last.fm "
  },
  {
    "path": "app/client/Services/AnalyticsService/PersistentCookieJar.cpp",
    "chars": 1968,
    "preview": "/*\n   Copyright 2005-2012 Last.fm Ltd.\n      - Primarily authored by Frantz Joseph\n\n   This file is part of the Last.fm "
  },
  {
    "path": "app/client/Services/AnalyticsService/PersistentCookieJar.h",
    "chars": 1138,
    "preview": "/*\n   Copyright 2005-2012 Last.fm Ltd.\n      - Primarily authored by Frantz Joseph\n\n   This file is part of the Last.fm "
  },
  {
    "path": "app/client/Services/AnalyticsService.h",
    "chars": 47,
    "preview": "#include \"AnalyticsService/AnalyticsService.h\"\n"
  },
  {
    "path": "app/client/Services/RadioService/RadioService.cpp",
    "chars": 16165,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Services/ScrobbleService/ScrobbleService.cpp",
    "chars": 12685,
    "preview": "/*\n   Copyright 2005-2010 Last.fm Ltd. \n      - Primarily authored by Jono Cole and Michael Coffey\n\n   This file is part"
  },
  {
    "path": "app/client/Services/ScrobbleService/ScrobbleService.h",
    "chars": 3159,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Services/ScrobbleService/StopWatch.cpp",
    "chars": 2448,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Services/ScrobbleService/StopWatch.h",
    "chars": 2193,
    "preview": "/*\n   Copyright 2005-2009 Last.fm Ltd. \n      - Primarily authored by Max Howell, Jono Cole and Doug Mansell\n\n   This fi"
  },
  {
    "path": "app/client/Services/ScrobbleService.h",
    "chars": 84,
    "preview": "#include \"ScrobbleService/ScrobbleService.h\"\n#include \"ScrobbleService/StopWatch.h\"\n"
  },
  {
    "path": "app/client/Settings/AccountSettingsWidget.cpp",
    "chars": 2225,
    "preview": "/*\n   Copyright 2010 Last.fm Ltd.\n      - Primarily authored by Jono Cole, Michael Coffey, and William Viana\n\n   This fi"
  }
]

// ... and 764 more files (download for full content)

About this extraction

This page contains the full source code of the lastfm/lastfm-desktop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 964 files (11.7 MB), approximately 3.1M tokens, and a symbol index with 6796 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!