2013-02-24 Riccardo Mottola <rm@gnu.org>

	* Frameworks/Cynthiune/NSColorExtensions.m
	Remove OSX Hack.

2013-02-07: Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Bundles/FLAC/FLAC.h
	  make it compile with non-fragile ABI
	* Bundles/Musepack/Musepack.m
	  fix potentially uninitialized return value
	* CynthiuneFadingTextField.h
	  float -> CGFloat transition
	* CynthiunePauseButton.m
	* MBResultsPanel.m
	* PlaylistViewController.m
	* Player.m
	  NS(U)Integer transitions, and fixing some NSLog
	  format strings
	  All this together makes the Player fading when start playing
	  a song work again on amd64

2013-01-27: Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Bundles/VorbisTags/VorbisTags.m do not leak file descriptor

2013-01-22: Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Cynthiune.gorm remove menu entry to send bug report mail

2012-07-23  Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* CynthiuneController.[h|m]
	remove reference to Mailservice, and the sendABugReport method

2012-07-23  Yavor Doganov  <yavor@gnu.org>
        Enable optional MusicBrainz support, port to libmusicbrainz5/3.
        * GNUmakefile.preamble (_have_musicbrainz5, _have_musicbrainz3):
        New helper variables; attempt to detect the installed versions of
        libmusicbrainz.
        (ADDITIONAL_CPPFLAGS, ADDITIONAL_GUI_LIBS): Conditionally define
        based on the tests above.
        * SongInspectorController.m: Conditionally include
        <musicbrainz5/mb5_c.h> or <musicbrainz3/mb_c.h>.
        (_setFieldsEditable:): Disable MB lookup if no version of
        libmusicbrainz if found.
        (MakeQis, FreeQis, -_generateTrmId): Remove.
        (-lookupThread, -_parseMB:, -readMB:track:): Adapt to the new
        libmusicbrainz API.
        * NEWS: Update.

2012-07-23 Riccardo Mottola <rm@gnu.org>

	* Frameworks/Cynthiune/MailService.m
	* Frameworks/Cynthiune/MailService.h
	Deleted

	* Frameworks/Cynthiune/GNUmakefile
	* Cynthiune.gorm
	Removed bug sendng option through mail.

2012-07-23 Riccardo Mottola <rm@gnu.org>

	* Player.m
	* Frameworks/Cynthiune/Output.h
	Change pointer qualifier to be Panther compatible.
	
2012-07-22 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* remove debug NSLog from Sndio backend

2012-07-22 Riccardo Mottola <rm@gnu.org>

	* Bundles/MacOSX/MacOSXPlayer.h
    * Bundles/MacOSX/MacOSXPlayer.m
    Accept and use the Endianness parameter.

2012-05-29 Riccardo Mottola <rm@gnu.org>

	* Bundles/ALSA/ALSA.m
	First try setting the device to the requested rate without resampling,
	then to 44kHz with resampling.

2012-05-28: Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Sndio/Sndio.[h|m]
	cleanup a bit

2012-05-28 Riccardo Mottola <rm@gnu.org>

	* PreferencesController.m
	* Frameworks/Cynthiune/NSViewExtensions.m
	Use centerScanRect to avoid fractional positioning.

2012-05-28: Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Sndio/Sndio.[h|m]
	Fix how NativeEndianness is handles
	call prepareDeviceWithChannels:... unconditionally when
	openDevice is called. This is needed when the playing was 
	stopped (sio_stop called) and then started again. When
	the next played song had the same channels/rate/endianness
	the device would not initialized again correctly.

2012-05-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Sndio/Sndio.[h|m]
	Introduce locking comparable to AO output bundle.
	Makes Sndio now work for me. Still contains lots of
	debug output, which needs cleanup.

2012-05-21  Philippe Roussel  <p.o.roussel@free.fr>

	* Bundles/ALSA/ALSA.m
	Protect calls with lock.

2012-05-23 Riccardo Mottola <rm@gnu.org>

	* Bundles/AudioFile/GNUmakefile
	* Bundles/AudioFile/GNUmakefile.preamble
	* Bundles/WaveOut/WaveOut.m
	Adapt windows port to new methods and standards.

2012-05-22 Riccardo Mottola <rm@gnu.org>

	* Bundles/ID3Tag/ID3Tag.h
	* Bundles/ID3Tag/ID3Tag.m
	Do not redefine ID3 types.

	* Bundles/MacOSX/MacOSXPlayer.m
	Conform to new endianness parameter.

2012-05-21  Philippe Roussel  <p.o.roussel@free.fr>

	* Bundles/ALSA/ALSA.m
	* Bundles/ALSA/ALSA.h
	Device parameters need to be set when they change from one
	song to another. In that case prepareDeviceWithChannels: is
	called with an open device so check for pcm_handle and set
	params if it's not NULL.
	prepareDeviceWithChannels: is always called before openDevice
	so we can handle endianness in there.
	ALSA device is used by 2 threads, protect it with a lock.

2012-05-19 Riccardo Mottola <rm@rnu.org>

	* Cynthiune.nib
	Fix problems and add playlist.

	* CynthiuneController.m:
	Fix header imports.

2012-05-17  Philippe Roussel  <p.o.roussel@free.fr>

	* PlaylistController.m
	Optimize adding multiple songs to the playlist by using
	[Playlist -addSongsInArray:] : PlaylistChangedNotification
	is sent only one time, not for every song added

2012-05-17 Riccardo Mottola <rm@gnu.org>

	* PlaylistController.m
	Fix repeat and shuffle menu items.

	* Frameworks/Cynthiune/utils.h
	Map macros to GNUstep macros and provide Mac replacements.

2012-05-16  Philippe Roussel  <p.o.roussel@free.fr>

       * Player.m
       * Player.h
       Fix crashes when seeking through a file when using a threaded
       backend. In this case the input stream is accessed from at
       least two threads and so must be protected by a lock.

2012-05-15 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Playlist.m
	  just skip duplicate songs when loading playlists or 
	  trying to add a song already in the playlist instead
	  of throwing an exception and aborting

2012-05-14 Philippe Roussel

	* Bundles/Timidity/Timidity.m
	  do not crash when loading a .mid file
	  without having timidity installed

2012-05-14 Philippe Roussel

	* Song.m
	Proper isEqual compare.

	* PlaylistController.m
	Fix playlist and bundle loading.

2012-05-13 Philippe Roussel

	* Playlist.m
	* Song.m
	* Bundles/Esound/EsoundPreference.m
	* Bundles/OSS/OSS.h
	* Bundles/WindowsMedia/CWMFile.cpp
	Fix

	* Bundles/Esound/Esound.m
	Conform to new protocol

	* Bundles/Ogg/Ogg.m
	Endianness to native.

2012-05-13 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Sndio/Sndio.[h|m]
	handle media-endianness given in the media bundles.

2012-05-13 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Timidity/Timidity.m
	Default eniannessd needs to be native, otherwise
	macppc play garbage
	Use relative name to find timidity binary
	Switch buffer size from 65536 to DEFAULT_BUFFER_SIZE
	defined in Output.h

2012-05-13 Riccardo Mottola <rm@gnu.org>

	* Bundles/FLAC/FLAC.m
	* Bundles/Mod/Mod.m
	* Bundles/Musepack/Musepack.m
	Set default endianness to native.

2012-05-13 Riccardo Mottola <rm@gnu.org>

	* Bundles/WindowsMedia/WindowsMedia.m
	Set endianness to native.

2012-05-13 Riccardo Mottola <rm@gnu.org>

	* Player.h
	* Player.m
	* Bundles/ALSA/ALSA.h
	* Bundles/ALSA/ALSA.m
	* Bundles/AO/ao.m
	* Bundles/AudioFile/AudioFile.m
	* Bundles/MP3/MP3.m
	* Bundles/OSS/OSS.h
	* Bundles/OSS/OSS.m
	* Bundles/WindowsMedia/WindowsMedia.m
	* Frameworks/Cynthiune/Format.h
	* Frameworks/Cynthiune/Output.h
	Set media-endianness in media and output bundle.

2012-05-09 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* GNUmakefile
        fix detection of OpenBSD in order to build the Sndio bundle

2012-05-09 Riccardo Mottola <rm@gnu.org>

	* PlaylistController.m
	Remove hacks and use runModalForTypes.

2012-05-09 Riccardo Mottola <rm@gnu.org>

	* PlaylistController.h
	* PlaylistController.m
	* Cynthiune.gorm
	* English.lproj/Localizable.strings
	Implement open playlist

2012-05-08 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/AO/ao.m fix crasher when jumping automatically
	  from one song to the next which have different bit rates
	  patch from Philippe Roussel

2012-05-05 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Sndio/Sndio.m Force to use little endian
	  format, to make it work on Big Endian architectures

2012-05-05 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/AO/ao.m fix resetting of audio parameters
	  when automatically jumping to next song with different
	  bit rate. Further, use AO_FMT_LITTLE, to fix output
	  on big endian systems, i.e. PowerPC. From Philippe
	  Roussel, Thanks!

2012-05-04 Riccardo Mottola <rm@gnu.org>

	* GeneralPreference.m
	When reading preferences, transform in a mutable dictionary since that is what we expect.

	* SongInspectorController.m
	Don't set the inspector to status level: it is ugly and doesn't work on Unity and other WMs anyway.

2012-05-04 Riccardo Mottola <rm@gnu.org>

	* Bundles/ID3Tag/ID3Tag.m
	Compare strings with strcmp and not ==

2012-05-03  Philippe Roussel  <p.o.roussel@free.fr>

	* Bundles/AO/*
	New output bundle base on libao.

	* GNUmakefile
	Add AO bundle to the build, unless disable-ao=yes if used.

2012-05-03 Riccardo Mottola for Yavor Doganov

	* GNUmakefile
	* GeneralPreference.m
	* Bundles/ALSA/ALSA.h
	* Bundles/ALSA/ALSA.m
	* Bundles/ALSA/GNUmakefile
	* Bundles/ALSA/GNUmakefile.preamble
	ALSA backend fron Yavor with slight modifications

2012-05-02 Riccardo Mottola <rm@gnu.org>

	* GNUmakefile.preamble
	* Bundles/ASFTags/GNUmakefile
	* Bundles/ASFTags/GNUmakefile.preamble
	* Bundles/FLAC/GNUmakefile
	* Bundles/FLAC/GNUmakefile.preamble
	* Bundles/FLACTags/GNUmakefile
	* Bundles/FLACTags/GNUmakefile.preamble
	* Bundles/ID3Tag/GNUmakefile
	* Bundles/ID3Tag/GNUmakefile.preamble
	* Bundles/MP3/GNUmakefile.preamble
	* Bundles/OSS/GNUmakefile
	* Bundles/OSS/GNUmakefile.preamble
	* Bundles/Taglib/GNUmakefile
	* Bundles/Taglib/GNUmakefile.preamble
	* Bundles/Timidity/GNUmakefile
	* Bundles/Timidity/GNUmakefile.preamble
	* Bundles/VorbisTags/GNUmakefile
	* Bundles/VorbisTags/GNUmakefile.preamble
	* Bundles/WaveOut/GNUmakefile.preamble
	* Bundles/WindowsMedia/GNUmakefile
	* Bundles/WindowsMedia/GNUmakefile.preamble:
	Fix linking flags for Windows

2012-05-02  Yavor Doganov  <yavor@gnu.org> (originally 2009-04-09)

	* Frameworks/Cynthiune/GNUmakefile
	(Cynthiune_LIBRARIES_DEPEND_UPON): Add $(OBJC_LIBS).
	* Bundles/ID3Tag/GNUmakefile.preamble (ADDITIONAL_LDFLAGS): Rename
	as...
	(BUNDLE_LIBS): ...which is the proper variable.
	* Bundles/AudioFile/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/FLACTags/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/FLAC/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/Musepack/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/Esound/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/aRts/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/WindowsMedia/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	* Bundles/MP3/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	(TAGLIB_CFLAGS, TAGLIB_LIBS): Do not define.
	* Bundles/Mod/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.  Don't link against libstdc++.
	* Bundles/VorbisTags/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	(VORBIS_LIBS): Don't link against libvorbisenc.
	* Bundles/Ogg/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	(VORBIS_LIBS): Likewise.
	* Bundles/Taglib/GNUmakefile.preamble (ADDITIONAL_LDFLAGS)
	(BUNDLE_LIBS): Likewise.
	(TAGLIB_LIBS): Link only against libtaglib_c.
	* frameworks.make (ADDITIONAL_LDFLAGS): Rename as...
	(ADDITIONAL_GUI_LIBS): ...this.

2012-04-30 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>

	* Bundles/Sndio/Sndio.h
	* Bundles/Sndio/Sndio.m
	  try make it work more reliable, still not perfect yet

2012-04-30 Riccardo Mottola <rm@gnu.org>

	* SongInspectorController.m:
	* CynthiunePauseButton.m:
	Fix warning in initialization.

	* Frameworks/Cynthiune/utils.h
	Use new runtime function name sel_getName()

2012-04-30 Riccardo Mottola <rm@gnu.org>

	* Bundles/MP3/MP3.h
	* Bundles/MP3/MP3.m
	Do not use @def() and expose ivars public to enable compiling with non-fragile ABI.

2012-04-30: Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* SongInspectorController.m do not include musicbrainz
	  header for now. From Philippe Roussel
2012-04-29 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* README, point out how to build with old musepack API
	* Bundles/Musepack/CNSFileHandle.h
	* Bundles/Musepack/CNSFileHandle.m
	* Bundles/Musepack/Musepack.h
	* Bundles/Musepack/Musepack.m 
	  Build against new Musepack API by default, based on patches from
	  Debian from Yavor Doganov, forwarded by Philippe Roussel
	  Build against old API using ADDITIONAL_OBJCFLAGS=-DMUSEPACK_API_126
	  in the make environment while building Cynthiune
2012-04-29 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* GNUmakefile remove old GNUSTEP_INSTALLATION_DIR
2012-04-29 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	Take patches from Debian, from Yavor Doganov  <yavor@gnu.org>
	Forwarded from Philippe Roussel, to fixFTBFS and adopt
	to the slightly changed avifile API.
        * Bundles/WindowsMedia.CWMFile.h (WMStreamReadFrames): Typo fix.
        * Bundles/WindowsMedia/CWMFile.cpp: Include <infotypes.h>.
        (WMFileAudioStreamCount, WMStreamGetFrameSize): Cast the
        result to unsigned int.
        (WMStreamReadFrames) <_samplesRead, _bytesRead>: Declare of
        type size_t.  Amend the call to readStream->ReadFrames
        accordingly.
2012-04-26 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Bundles/OSS/GNUmakefile.preamble
	  only link against libossaudio on OpenBSD
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* GNUmakefile.preamble use pkg-config to find the goom libraries
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Add the Sndio Output Bundle, still work in progress
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Bundles/Esound/EsoundPreference.m include NSDictionary.h
	* CynthiuneController.m do not include nonexisting header
	* CynthiuneAnimatedImageView.m, CynthiunePauseButton.m,
	  CynthiuneSongTitleCell.m add [super dealloc]
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Frameworks/Cynthiune/GNUmakefile.preamble diable mcheck
	* Frameworks/Cynthiune/NSCellExtensions.m include NSFoundation.h
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* SongInspectorController.m disable LibMusicBrainz for now
	* GNUmakefile, GNUmakefile.preamble disable mcheck, and 
	  libmusicbrainz, and add Sndio bundle if statement
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* PlaylistController.m fix opening open Panel
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* GeneralPreference.m make Sndio backend the default on OpenBSD
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Bundles/FLAC/FLAC.* update to newer FLAC API
	* Bundles/FLAC/FLACTags.m update to newer FLAC API
2012-03-25 Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* BundleManager.m make it find Cynthiunes bundles, and simplify
	  some while loops
	* Bundles/*/GNUmakefile install bundles in right location
	* Bundles/*/GNUmakefile.preamble do not link against mcheck when
	  debug flag is set
2012-03-25  Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
	* Initial Import to GAP CVS
2006-03-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUmakefile: release 0.9.5.

	* Player.m ([Player -readNextChunk:bufferwithSize:bufferSize]):
	return 0 if the code returned was 0 or less.

2006-03-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistView.m ([PlaylistView -_selectionTopByExtendingIt:keep]) 
	([PlaylistView -_selectionBottomByExtendingIt:keep]): take
	selectionDir into account.

	* PlaylistController.m ([PlaylistController -updateStatusLabel]):
	made public.
	([PlaylistController -toggleShuffle:sender]): shuffle also if
	currentPlayerSong is not set.
	Adapted to new (closer) relationship with PlaylistViewController.

	* PlaylistViewController.m: removed setDelegate:, replaced it with
	the more appropriate "setPlaylistController" since we know for
	sure there will be one. Removed all the custom notifications from
	this class and invoke directly some new methods from the
	playlistController.

	* CynthiuneController.m ([CynthiuneController -awakeFromNib]): set
	the playlistWindow as the next responder for the playerWindow.

	* PlaylistView.m ([PlaylistView -performKeyEquivalent:event]):
	overload this method instead of keyDown: which is "lower-level"
	and is not invoked when the key event occurs when the focus is on
	another widget.
	([PlaylistView -_selectionUpByExtendingIt:keep]) 
	([PlaylistView -_selectionDownByExtendingIt:keep]) 
	([PlaylistView -_selectionTopByExtendingIt:keep]) 
	([PlaylistView -_selectionBottomByExtendingIt:keep]): invoke
	scrollRowToVisible: with the appropriate argument.

	* PlaylistController.m ([PlaylistController
	-playlistViewActivateSelection:view]): new method bound to the
	return key.
	([PlaylistController -playlistViewDeleteSelection:view]): new
	method bound to the delete key.

	* PlaylistViewController.m ([PlaylistViewController -playlistViewActivateSelection:view]) 
	([PlaylistViewController -playlistViewDeleteSelection:view]):
	added proxy methods transferring the call to PlaylistController.

	* PlaylistView.m ([PlaylistView -keyDown:event]): moved the
	keyboard handling here, replacing the one previously in
	CynthiuneController.

	* PlaylistViewController.m ([PlaylistViewController
	-selectSongsInArray:array]): removed the "extend" parameter.

2006-03-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.m ([CynthiuneController -keyPressed:event]):
	new method to fulfill the CynthiuneWindowDelegate protocol that
	handles known keypresses (the arrow keys + return + delete) before
	the responder API does it.

	* PlaylistController.m ([PlaylistController -selectPreviousSong:senderbyKeepingSelection:keep]) 
	([PlaylistController
	-selectNextSong:senderbyKeepingSelection:keep]): new method to
	manipulate the song selection in the playlist view externally.

	* PlaylistViewController.m ([PlaylistViewController
	-selectSongsInArray:arraybyExtendingSelection:extend]): added an
	"extend" parameter to this method to control whether the selection
	should be extended rather than implicitly doing it.

	* CynthiuneWindow.m ([CynthiuneWindow -keyDown:]): new subclass
	method to intercept keypresses before the API does.

	* SongInspectorController.m ([SongInspectorController -song]): new
	accessor method.

	* Song.m ([Song -_tagsClassesForProtocol:protocol]): method
	derived from its previous "_tagsClassForProtocol:" version. Now
	returning all the classes found as strings in an enumerator.
	([Song -_refreshSongInfos]): walk all the classes returned by
	_tagsClassesForProtocol: until one is found and does not return NO
	on the reading operation.
	([Song
	-setTitle:newTitleartist:newArtistalbum:newAlbumgenre:newGenretrackNumber:newTrackNumberyear:newYear]): same as above but for writing.

	* PlaylistController.m ([PlaylistController
	-cleanupPlaylist:sender]): if the song viewed in the song
	inspector is one of the invalid songs, stop viewing it.
	The repeat and shuffle buttons were removed from the toolbar and
	put on the player window instead, since those features really have
	to do with the player rather than with the playlist per se.

2006-03-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-lookupThread]): set the mb label to an empty string whenever an
	error occurs so the user doesn't keep waiting.

	* MBResultsPanel.m ([MBResultsPanel
	-_createTableView:contentView]): added a column for the track number.

	* SongInspectorController.m ([SongInspectorController
	-lookupThread]): add song metadata to the parameters of the mb
	query so that their server can maybe return a more accurate
	result. Also, ask mb to use UTF8.

2006-03-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/ID3Tag/ID3Tag.m: bundle now conform to the TagsWriting
	protocol.

	* Bundles/Musepack/CNSFileHandle.m (CNSFileHandleCanSeek) 
	(CNSFileHandleSeek): those functions really should return an
	mpc_bool_t rather than a BOOL.

	* Bundles/Mod/Mod.m ([Mod
	-readNextChunk:bufferwithSize:bufferSize]): test the architecture
	endianness with cpp rather than at runtime.

	* Bundles/Musepack/Musepack.m ([Musepack
	-readNextChunk:bufferwithSize:bufferSize]): invoke
	invertBytesInBuffer on big endian architectures.

	* PlaylistView.[hm]: renamed module from PlaylistTableView.

	* Bundles/FLACTags/FLACTags.[hm]: new tags bundle for reading tags
	metadata from FLAC files.

	* Bundles/FLAC/FLAC.m: purge code that was there for tags reading,
	moved to FLACTags and modified.

	* PlaylistViewController.m ([PlaylistViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	don't do anything with the sort order if the number of songs in
	the list is < 1.

	* CynthiuneHeaderCell.m ([CynthiuneHeaderCell -widthOfText:text]):
	add the size of the arrow + its offset when computing this value.

	* CynthiuneSongTitleCell.m ([CynthiuneSongTitleCell
	-widthOfText:text]): add the size of the arrow + its offset when
	computing this value.

	* PlaylistViewController.[hm]: renamed module from
	TableViewController.

2006-03-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	changed algorithm so that we would use the column identifier and
	the sort order rather than the previous "sortedInPlaylist" and
	"sortedInDuration" bools.

	* CynthiuneHeaderCell.m ([CynthiuneHeaderCell -cellSize]): added
	the size of the arrow to the regular cell size so that sizeToFit
	has a better reference on how much size to prepare.

	* Playlist.m ([-sortByPlaylistRepresentation:reverseOrder]) 
	([Playlist -sortByDuration:reverseOrder]): use the "reverseOrder"
	parameter... in correct order.

2006-03-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSStringExtensions.m
	([-caseInsensitiveCompareContainingDirectory:aString]): removed
	method. Foundation's stringByDeletingLastPathComponent does the
	job for us.

2006-03-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): modified
	the sort ordered so that two songs are first compared base on
	their parent directories.

	* Frameworks/Cynthiune/NSStringExtensions.m ([NSString
	-caseInsensitiveCompareContainingDirectory:aString]): new method
	to case-insensitively compare the dirname of two filenames.

2006-03-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): modified
	the sort order so that the songs from the same album but from a
	different artist are still ordered by song number.

	* Bundles/aRts/aRts.m ([aRts -_launchServer]): new method to
	launch the artsd daemon if it's not running.

	* Bundles/OSS/OSSPreference.m ([OSSPreference
	-controlTextDidEndEditing:notification]): same as below.

	* Bundles/Esound/EsoundPreference.m ([EsoundPreference
	-controlTextDidEndEditing:notification]): this new delegate method
	replaces the old hostAction: and portAction: methods by modifying
	the value from the field that ended being modified. This
	replacement permits the user to no longer have to press return to
	validate its changes.

	* Bundles/Esound/Esound.m ([Esound -openDevice]): try five times
	to open the esound socket at 2/10th of seconds of interval to
	ensure the daemon is either started correctly or that it really
	failed.

2006-03-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -_oPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_startOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_ejectOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_removeArrayOfSongs:array]) 
	([PlaylistController -removeAllSongs:sender]) 
	([PlaylistController -openSongFromNSApp:filename]):
	invoke invalidateSortedColumn on tableViewController.
	([PlaylistController -cleanupPlaylist:sender]): do something only
	if the amount of invalid songs reported is > 0.

	* CynthiuneHeaderCell.m
	([-drawInteriorWithFrame:cellFrameinView:controlView]): no longer
	use images to draw sort-order arrows, invoke the new
	_drawArrowOfSize:... (see below) instead.
	([CynthiuneHeaderCell
	-_drawArrowOfSize:arrowSizeatReferencePoint:refPoint]):
	draws an arrow using NSBezierPath.

	* TableViewController.m ([TableViewController
	-invalidateSortedColumn]): made method public. Invoke
	"setNeedsDisplay:" on the [playlistView headerView] to make sure
	we don't see any sorting indicator while the list is unsorted.

2006-03-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController -_saveSortOrderColumn:sortColumninDirection:sortDirection]) 
	([TableViewController -_restoreSortOrder]): added those two new
	methods to save the state of the sort order in the playlist and to
	restore it at launch time.
	([TableViewController -awakeFromNib]): removed the "scrollView"
	ivar which was only used here anyway.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	slightly optimized methods by reducing message calls and
	generalizing the variables.
	([TableViewController
	-tableView:tableViewacceptDrop:inforow:rowdropOperation:op]):
	call _invalidateSortedColumn after a drop.
	([TableViewController -_invalidateSortedColumn]): invalidate the
	ivars related to sorting as well as the header appearance and the
	state saved to the user defaults.

2006-03-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor +evenRowsBackgroundColor]),
	([NSColor +evenRowsBackgroundColor]): inverted the values returned
	by those methods to permit our tableview to display the stripes by
	taking into account the ones displayed by the Nesedah Camaelon theme.

	* Bundles/VorbisTags/VorbisTags.m: updated copyright.
	([VorbisTags
	+setTitle:titleartist:artistalbum:albumtrackNumber:trackNumbergenre:genreyear:yearofFilename:filename]): enabled writing to vorbis file through the code taken from Poe.app.

2006-03-02  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -streamOpen:fileName]): call _resetIvars
	from here instead of init.
	([-streamClose]): don't call _resetIvars from here.

	* PlaylistController.m ([PlaylistController -_initButtonImages]):
	added tooltips to the playlist toolbar buttons.

	* Player.m ([Player -setStream:newStream]): changed method
	definition to accept the stream to analyze as parameter instead of
	using the "stream" ivar.
	([Player -setStream:newStream]): set the "stream" ivar to
	newStream only after the channels and and sample rate were defined
	for it. This to avoid a crash when using a threaded output plugin
	([Player -stop]): if the output is threaded, send a stopThread
	message to the output plugin only if not paused, since this was
	putting us in an infinite loop (thread already stopped).

	* CynthiuneHeaderCell.[hm]: new class that displays an indicator
	of the state of the list sorting in the playlist table.

2006-02-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor
	+alternateSelectedControlTextColor]): the default selected text
	color modified to be visible under OSX with the orange/yellow
	background color we use in our NSTableView...

2006-02-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.m ([CynthiuneController -awakeFromNib]):
	apply resize increment of (1, 16) to playlistWindow.

2006-02-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/aRts/aRts.m ([aRts -threadLoop]): adapted to the new
	definition of the Output protocol.

	* Player.m ([Player -init]): new "closingThread" ivar, indicating
	whether the Output thread is closing.
	([Player -init]): new "streamsToClose" mutable array, containing
	streams to be closed when the Output thread is done using them.
	([Player -_closePendingStreams]): new method to be commanded from
	the Output thread through the main thread to clean up the
	streamsToClose array.
	([Player -readNextChunk:bufferwithSize:bufferSize]): if
	closingThread is set, stop waiting for "awaitingNewStream" to be
	set and do nothing else.

2006-02-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WaveOut/WaveOut.m ([WaveOut -_loopIteration]): modified
	method to take the changes to the ParentPlayer informal protocol
	into account. Also, free the sound blocks with the new FreeBlock
	functions so as to also free the data chunk that was allocated
	with malloc.
	(FreeBlock): new method to correctly free the memory used by a
	WAVEHDR structure.

2006-02-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -init]): new
	"notifiedFirstSong" ivar designed to remember the first song
	given by the PlaylistChangedNotification.
	([PlaylistController -playlistChanged:aNotification]): receive the
	first song given by the notification. If notifiedFirstSong is set,
	which means the process of feeding the playlist has not yet
	ceased, do nothing. Otherwise set it to the received song.
	([PlaylistController -tableFilenamesDropped:aNotification]):
	receive the TableFilenamesDroppedNotification from the
	TableViewController. Feed the playlist with the songs passed
	through the userInfo dict.
	([PlaylistController -_oPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_startOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_ejectOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -openSongFromNSApp:filename]): handle song
	filenames to _feedPlaylistWithTreeOfFilenames: and take
	notifiedFirstSong ivar into account if the Player is not running.

	* TableViewController.m ([TableViewController
	-setDelegate:anObject]): declare new
	TableFilenamesDroppedNotification notification.
	([TableViewController -_bestFit:stringforColumn:column]): reduce
	the size of the string by 1 char if the string ends with a space.
	([TableViewController -_acceptDroppedFiles:aFilesListatRow:row]):
	no longer handles the song insertion into the playlist anymore,
	instead post a notification with the array of filenames to the
	observer.

	* Song.m ([Song -encodeWithCoder:encoder]): encode date only if
	not nil.

	* CynthiuneController.m ([CynthiuneController
	-_initPlaylistWindowButtons]): new method to hide the buttons from
	the Playlist window title bar.
	([CynthiuneController -_parseArguments]) 
	([CynthiuneController -application:applicationopenFile:filename]):
	pass the song filename as argument instead of a Song instance to
	PlaylistController's openSongFromNSApp: method.

	* GeneralPreference.m ([GeneralPreference -_initDefaults]):
	NSWindows are no longer textured by default.

	* CynthiuneSongTitleCell.m ([CynthiuneSongTitleCell -cellSize]):
	take the margins left and right to the image into account.
	([CynthiuneSongTitleCell
	-drawWithFrame:cellFrameinView:controlView]): use aFrame instead
	of imageFrame as argument to NSRectFill().

	* CynthiuneFadingTextField.m ([CynthiuneFadingTextField
	-awakeFromNib]): new method to add the fadeoutClone field to the
	parent view instead of in viewDidMoveToSuperview.
	([-viewDidMoveToSuperview]): removed method.

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor +evenRowsBackgroundColor]) 
	([NSColor +oddRowsBackgroundColor]): balance the values for red
	and green to obtain a pure shade of blue.
	([NSColor +rowsHighlightColor]): use a softer orangish color.
	([NSColor +alternateSelectedControlColor]): work-around a bug in
	MacOSX where the rows are highlighted with a different color than
	specified for a fraction of a second.

	* Playlist.m ([Playlist -postNotificationWithSongAsFirst:song]):
	new method that post the PlaylistChangedNotification notification
	withs the song given as argument in the userInfo dictionary. So
	that the PlaylistController can now which song to point to when a
	new batch of songs is added.
	([Playlist -addSong:song], [Playlist -addSongsInArray:array]) 
	([Playlist -insertSong:songatIndex:index]): modified those methods
	to use the new method above.

	* Bundles/MacOSX/MacOSXPlayer.m (inputCallback): modified function
	to reflect to take the changes to the ParentPlayer informal
	protocol into account.

	* Frameworks/Cynthiune/Output.h: modified the ParentPlayer
	protocol to take account of the change below.

	* Player.m ([Player -readNextChunk:bufferwithSize:bufferSize]):
	new method derived from the obsolete readNextChunk that feeds the
	threaded player calling it with song data.

2006-02-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController -hide]): compute
	"hideInterval" from the interval and numberOfIterations method of
	the title text field.

2005-12-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistArchiver.m ([PlaylistArchiver
	+_saveDictionaries:dictionariestoFile:filename]): standardize
	target directory name.

	* M3UArchiver.m ([M
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): use the playlist representation as metadata.

	* Song.m ([Song -setFilename:aFilename]): standardize path of
	filename given so that we are sure "filename" always point
	directly to the final file.
	([Song -initWithCoder:decoder]): same as above.
	([Song -encodeWithCoder:encoder]): encode the playlist
	representation for playlist file handlers which might make use of
	it.

2005-12-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -_resetIVars]): new "lostSyncs" ivar,
	defaulting to 0, meant to count the number of successive losses of
	frame syncs.
	(decodeInputBuffer): when a MAD_ERROR_LOSTSYNC occurs, compute the
	size mad has to skip and increase the lostSyncs ivar.

	* PlaylistController.m ([PlaylistController
	-_filteredSubtree:filename]): sort the resulting array before
	returning it.

2005-12-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -songInfosCanBeModified]): test whether the song
	file is writable.

	* SongInspectorController.m ([SongInspectorController
	-_setFieldsEditable:editable]): show or hide "lock.tiff" depending
	on whether the song metadata can or cannot be changed.

2005-12-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong]): set status to SongOK
	whenever the stream could be opened.

2005-12-07  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-lookupThread]): added code to check whether the TrmID is a the special
	"busy" one and if an error occured.

2005-11-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_initProgressSlider]): the new cell should recover the action and
	target from the old cell since the nib handler has set them
	beforehand.

2005-11-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSliderCell.m ([CynthiuneSliderCell -init]): replaced
	knobImage with knobCell so that the drawing code is done within
	NSCell (more portable and easier way of doing things).
	([CynthiuneSliderCell -drawBarInside:cellFrameflipped:flipped]):
	no longer draw the control background since the cell is declared
	as non-opaque.
	([CynthiuneSliderCell -isOpaque]): declare the cell as non-opaque.

	* TableViewController.m ([TableViewController
	-tableView:tableViewobjectValueForTableColumn:tableColumnrow:rowIndex]): manage columns which have a non-nil identifier.

	* CynthiuneSlider.[hm]: removed module after it was found
	unnecessary to subclass NSSlider to obtain a custom look for the
	song slider.
	
	* CynthiuneController.m ([CynthiuneController -awakeFromNib]):
	request the PlaylistController instance to create an NSToolbar
	instance with itself as delegate. Also, made code related to
	window position clearer.

	* PlaylistController.m ([PlaylistController -toolbar:toolbaritemForItemIdentifier:itemIdentifierwillBeInsertedIntoToolbar:flag]) 
	([PlaylistController -toolbarAllowedItemIdentifiers:toolbar]) 
	([PlaylistController -toolbarDefaultItemIdentifiers:toolbar]): new
	NSToolbar delegate callback methods.
	([PlaylistController -_initToolbarButtons]): new method to
	instantiate our NSToolbarItem's.
	([PlaylistController
	-_toolbarButtonWithIdentifier:identifiercallbackToSelf:selectorandImageName:imageName]): new method containing common code for NSToolbarItem instantiation.
	([PlaylistController -playlistToolbar]): new public method that
	returns the NSToolbar instance which CynthiuneController should
	put on the playlist window. This toolbar totally replaces the
	previous dropdown menu system.

2005-11-02  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSliderCell.m ([CynthiuneSliderCell
	-drawBarInside:cellFrameflipped:flipped]): use
	windowBackgroundColor instead of controlBackgroundColor to draw
	the background of the cell. This fixes a bug that would appear
	whenever the user colors were different than the regular system
	colors (at least on GNUstep).

2005-10-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-_setFieldsEditable:editable]): also controls the aspect of
	lookupButton, also depending whether threadRunning is set or not.

	* PlaylistController.m ([PlaylistController
	-playerSongEnded:aNotification]): udpate the info display only
	after the player has stopped to avoid displaying the first song.

	* Bundles/Taglib/Taglib.[hm]: made this class conform to the
	TagsWriting protocol too.

	* Song.m ([Song -init]): replaced tagsClass with readingTagsClass
	and writingTagsClass.
	([Song -_tagsClassForProtocol:protocol]): renamed from
	_detectTagsClass. Modified to return a tags class conform to a
	specified protocol.
	([Song
	-setTitle:newTitleartist:newArtistalbum:newAlbumgenre:newGenretrackNumber:newTrackNumberyear:newYear]):
	new method replacing the individual set{artist, album, ...}
	methods and invoking the "setTitle..." method of the
	writingTagsClass with the values that were modified.

2005-10-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/VorbisTags/VorbisTags.m ([VorbisTags
	+_setString:stringtoComment:commentfromOvFile:ovFile]): fixed a
	segfault occuring when parsing an invalid vorbis file.

2005-10-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -songInfosCanBeModified]): returns "YES" if the
	tags class is not 'nil' and conforms to the new "TagsReading"
	protocol.

	* Frameworks/Cynthiune/Tags.h: splitted the "Tags" protocol in 2
	separate protocols: "TagsReading" and "TagsWriting".

2005-10-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -songInfosCanBeModified]): new dummy method always
	returning 'NO' (for the moment).

	* SongInspectorController.m ([SongInspectorController
	-_updateFields]): set fields editable and make the MB lookup
	button accessible only if [song songInfosCanBeModified] returns
	'YES'.

	* CynthiuneController.m ([CynthiuneController
	-applicationWillTerminate:notification]): invoke savePlayerState
	on the playlist controller.

	* PlaylistController.m ([PlaylistController -savePlayerState]):
	new method that saves the status of the repeat and shuffle modes
	as well as the number of the current song.
	([PlaylistController -awakeFromNib]): recover the state save in
	the preferences.

	* CynthiuneController.m ([CynthiuneController -init]): ensure the
	user's Cynthiune directory does exist so that the default playlist
	can be created and read.

2005-10-03  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-addObjectRandomly:object]): modified to use srand() and rand()
	instead of srandom() and random().

2005-09-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-addObjectRandomly:object]): raise an exception when 'object'
	parameter is nil.
	([NSMutableArray -rotateUpToObject:object]): method that rotates
	the array left until the object passed as parameter reaches the
	first position.

	* PlaylistController.m ([PlaylistController
	-tableDoubleClick:aNotification]): invoke "shuffleFromSong:" on
	playlist so that we make sure the shuffle list is rotated.
	([PlaylistController -toggleShuffle:sender]): if
	'currentPlayerSong' is set, place it at the first position in the
	shuffle list.

	* Playlist.m ([Playlist -shuffleFromSong:song]): new method called
	from PlaylistController when a song is double-clicked while the
	list is shuffled.
	([-reShuffle]): removed obsolete method.

2005-09-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-addObjectRandomly:object]): new method that adds given object in
	a random position in the array.

2005-09-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/ASFTags/ASFTags.[hm]: new tags module for reading tags
	in ASF files.

	* Song.m ([Song -encodeWithCoder:encoder]): encode only fields
	which we are sure are non-nil.
	([Song -playlistRepresentation]): solved the case were the artist
	name could be nil and displayed as "(nil)".

2005-09-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/ID3Tag/ID3Tag.[hm]: new tags module for the id3tag tags
	library.

	* Frameworks/Cynthiune/Tags.h: new Tags protocol for tags module.

	* Bundles/Taglib/Taglib.[hm]: new tags module for the taglib tags
	library.

	* PlaylistController.m ([-toggleMute:sender]): removed method.
	([PlaylistController -_initButtonImages]): removed messages on the
	muteButton and muteMenuItem ivars (removed).

	* Player.m ([Player -init]): removed "muted" ivar.
	([Player -_playLoopIteration], [Player -readNextChunk]): no longer
	take the "muted" ivar into account since we removed the mute
	button.
	([-setMuted:aBool]): removed method.
	([-muted]): removed method.

2005-09-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -sortByDuration:reverseOrder]): reenabled
	method.
	([Playlist -sortByPlaylistRepresentation:reverseOrder]): reenabled
	method.

	* Frameworks/Cynthiune/NSStringExtensions.m ([NSString
	-linesFromFileContent]): new method that returns an array of
	strings representing the lines of the file represented by the
	receiver.

	* Frameworks/Cynthiune/utils.m (linesOfFile): removed function,
	replaced with "linesFromFileContent" method in class
	NSStringExtensions.

	* PlaylistArchiver.m ([PlaylistUnarchiver
	+dictionariesFromFilenames:filenames]): common method for playlist
	unarchivers which build list of dictionarycoders only from an
	array of filenames.

2005-09-23  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* M3UArchiver.m ([M +fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): encode the filenames relatively if withAbsoluteFilenameReference: is set.
	([M +dictionariesFromFileContent:contentinReferenceDirectory:directory]): implemented decoding method.

	* PLSArchiver.m ([PLSArchiver
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): encode the filenames relatively if withAbsoluteFilenameReference: is set.
	([PLSUnarchiver
	+dictionariesFromFileContent:contentinReferenceDirectory:directory]): implemented decoding method.

	* PlaylistArchiver.m ([PlaylistArchiver
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): changed method signature to accept the additional "withAbsoluteFilenameReference:" boolean parameter.
	([PlaylistArchiver
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): new temporary method that separates a string in different substrings representing the lines of a file.

	* GeneralPreference.m ([GeneralPreference
	-absolutePlaylistReferences]): added method that returns YES if
	the filenames should be absolute in the playlist files.

	* PlaylistFile.[hm]: removed module. Made obsolete by the new
	playlist archiving mechanism.

2005-09-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSStringExtensions.[hm] ([NSString
	-relativePathFromDirectoryToFile:filename]): new method that
	returns the relative path to file with the current string as a
	directory reference.

2005-09-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistArchiver.m ([PlaylistArchiver
	+fileContentFromDictionaries:
	inReferenceDirectory:]): changed method signature by adding a
	"directory" parameter which can serve as a reference for relative
	paths declared in playlist files.
	([PlaylistUnarchiver +dictionariesFromFileContent:
	inReferenceDirectory:]): changed method signature by adding a
	"directory" parameter which can serve as a reference for relative
	paths declared in playlist files.

2005-09-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistArchiver.m: added a new class "PlaylistUnarchiver",
	implementing a subset of the NSKeyedUnarchiver API, requiring the
	method "dictionariesFromFileContent:" from subclasses.

	* PlaylistController.m ([-addSongsFolders:sender]): removed method.
	([PlaylistController -addSong:sender]): removed "+ dir" entry in
	the playlist submenu.
	([PlaylistController
	-_feedPlaylistWithTreeOfFilenames:filenames]): new method taking an
	array of filenames as parameter and which populate the playlist
	with song files, the content of subdirectories and the content of
	playlist files.

	* FormatTester.m ([FormatTester -extensionIsSupported:extension]):
	added "cPls" to the list of known extensions.
	([FormatTester -fileIsPlaylist:filename]): new method returning
	YES if the filename passed as parameter a playlist in a known
	format.

	* Playlist.m ([Playlist -deleteAllSongsQuietly]): new method
	designed to remove all songs from the playlist without raising a
	notification.

2005-09-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -_readInfos]): set duration to 0 seconds when
	status is not SongOK.

	* PlaylistController.m ([PlaylistController +initialize]): new
	method, computing the value for the default playlist filename.
	([PlaylistController -awakeFromNib]): invoke loadFromFile on the
	playlist with the default playlist filename given as parameter,
	in place of the obsolete loadFromDefaults method.
	([PlaylistController -playlistChanged:aNotification]): save the
	list to the default playlist file.
	([PlaylistController -songInspectorDidUpdateSong:aNotification]):
	save the list to the default playlist file.

	* Playlist.m ([Playlist -saveToFile:file]): compare file extension
	case-insensitively.
	([Playlist -loadFromFile:file]): first implementation currently
	supporting NSKeyedUnarchiver only. This allows us to save and load
	default playlists again.

2005-09-09  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* M3UArchiver.m ([M3UArchiver
	+fileContentFromDictionaries:dictionaries]): new method mostly
	taken from the old PlaylistFile's _M3UContent method.

	* PLSArchiver.m ([PLSArchiver
	+fileContentFromDictionaries:dictionaries]): new method mostly
	taken from the old PlaylistFile's _PLSContent method.

	* PlaylistArchiver.m: new class module implementing a subset of
	the NSKeyedArchiver API and most of the common code needed for its
	concrete subclasses. Currently, only the method
	"fileContentFromDictionaries:" is required.

	* M3UArchiver.m, PLSArchiver.m: subclassed from PlaylistArchiver
	because of common code.

2005-09-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* DictionaryCoder.m ([DictionaryCoder -encodeObject:anObject:aKey]) 
	([DictionaryCoder -encodeBool:aBool:aKey]) 
	([DictionaryCoder -encodeInt:anInteger:aKey])
	([DictionaryCoder -encodeInt64:anInteger:aKey]): added encoding
	methods needed to save playlist state.
	([DictionaryCoder -decodeObjectForKey:aKey]) 
	([DictionaryCoder -decodeBoolForKey:aKey]) 
	([DictionaryCoder -decodeIntForKey:aKey]): 
	([DictionaryCoder -decodeInt64ForKey:aKey]): added decoding
	methods needed to save playlist state.

2005-09-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* DictionaryCoder.[hm]: new module that implements a minimal
	subclass of NSCoder to store song data in a dictionary. This, in
	order to use the NSCoding protocol of the Song class.

2005-09-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* M3UArchiver.[hm]: new module to implement a subset of the
	NSKeyedArchiver API that ouputs the relevant object data into a
	M3U-formatted playlist file.

	* PLSArchiver.[hm]: new module to implement a subset of the
	NSKeyedArchiver API that ouputs the relevant object data into a
	PLS-formatted playlist file.

	* Playlist.m ([-saveToDefaults]): removed obsolete method.
	([-loadFromDefaults]): removed obsolete method.
	([Playlist -saveToFile:file]): reimplemented method by choosing an
	archiver Class depending on the file extension given as parameter.

2005-08-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -timer]): make sure rate and channels are not
	0 before using them in the quotient.

2005-07-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WaveOut/WaveOut.m ([WaveOut -_freeBlocks]): stop the
	loop when no blocks are left allocated.

	* Bundles/MP3/MP3.m ([MP -streamOpen:fileName]) 
	([MP +streamTestOpen:fileName]): open the file with "b" mode flag
	set so that we make sure Windows opens it in binary-mode.

	* Bundles/WaveOut/WaveOut.[hm]: new threaded output bundle for the
	standard Windows sound api.

	* Bundles/MP3/MP3.m (testMP3Header): u_int16_t type changed to
	unsigned short for portability.

2005-06-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -setStream:newStream]): release the previous
	stream after the new one is made current, so that player threads
	can't crash the application when reading a potentially closed
	stream.

	* CynthiuneSliderCell.m ([CynthiuneSliderCell
	-drawBarInside:cellFrameflipped:flipped]): use
	"controlShadowColor" instead of "shadowColor".

2005-06-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -init]): new outputIsThreaded ivar to modify
	our behaviour depending on whether the output bundle is declared
	as threaded or not. Removed the "requests" ivar, considered
	useless.
	([Player -_handleEndOfSong]): new method that post a song-ended
	notification in the main thread from the new "readNextChunk"
	method.
	([Player -readNextChunk]): new method designed to feed threaded
	output bundles with data on request. Manage the end of songs.
	([Player -setPaused:aBool]): start or stop the thread of the
	threaded output bundles.

	* Bundles/aRts/aRts.[hm]: new threaded output bundle for the aRts
	sound daemon.

2005-06-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -seek:aPos]): compute a float to use as
	the multiplaction factor to find the correct position in the file.
	This solves a problem occuring due to the lack of precision with
	integer divisions.

2005-06-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSliderCell.m ([CynthiuneSliderCell -init]): the new
	default image for the slider knob is named "slider-knob-disabled".
	([CynthiuneSliderCell -setEnabled:enabled]): if enabled, set the
	image to "slider-knob-enabled".
	([CynthiuneSliderCell -drawBarInside:cellFrameflipped:flipped]):
	slider trail is one line wider.

	* Frameworks/Cynthiune/NSTimerExtensions.[hm]: new extension module
	to the NSTimer class, providing a new method "explode", which
	registers the current timer in the current runloop both for the
	NSEventTrackingRunLoopMode and the NSDefaultRunLoopMode.

	* PlaylistController.m ([PlaylistController -_startTimeTimer]):
	execute first iteration of _updateTimeDisplay. Don't retain the
	timer.
	([PlaylistController -_stopTimeTimer]): don't release the timer
	since it's no longer retained.
	([PlaylistController -startPlayer:sender]): check if song != nil
	instead of currentPlayerSong prior to start the player.

	* InfoDisplayController.m ([InfoDisplayController -_reallyHide]):
	hide the timer when the splash is hidden.

	* GoomView.[hm]: new subclass of NSView with support for the goom
	animation library.

2005-06-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-_bestFit:stringforColumn:column]): check that the length of the
	string is not >3, otherwise the call to NSMakeRange will generate
	an exception. Besides, also computes the width of the string by
	invoking the new [NSCell -widthOfText:] method.

	* MBResultsPanel.m ([MBResultsPanel -_sizeOfText:inCell:]): moved
	into the NSCellExtensions module.
	([MBResultsPanel -_updateColumnWidth:key]): updated following the
	above change.

	* Frameworks/Cynthiune/NSCellExtensions.m ([NSCell
	-widthOfText:text]): new method that returns the size the text
	passed as parameter would take in that NSCell.

	* Frameworks/Cynthiune/NSCellExtensions.[hm]: new extension module
	to the NSCell class.

2005-06-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-setDelegate:anObject]): declare the new
	SongInspectorDidUpdateSongNotification to the notification center.
	([SongInspectorController -save:sender]): notifies the observer
	that the song metadata was modified.
	([SongInspectorController
	-_updateInfoField:fieldwithString:string]): new method that
	returns true if the new string value of a text field has changed,
	or false otherwise.
	([SongInspectorController
	-_updateFieldsWithTrackInfos:trackInfos]): new method that
	modifies the info fields with the data contained in the dictionary
	passed as parameter.
	([SongInspectorController -_updateSongFields:allTrackInfos]): new
	method that updates the fields when one song track was returned or
	pops up a MBResultsPanel when it was more than one.
	([SongInspectorController -readMB:mbtrack:track]): new method that
	transforms the data received from MusicBrainz into an
	NSDictionary.
	([SongInspectorController -_parseMB:mb]): method redesigned to
	call the above.
	([SongInspectorController
	-resultsPanelDidEndWithTrackInfos:trackInfo]): new delegate method
	for the MBResultsPanel that updates the info fields with the data
	from the song track that was selected.

	* PlaylistController.m ([PlaylistController
	-songInspectorDidUpdateSong:aNotification]): new delegate method
	to update the table view whenever the song inspector notifies us
	of a change in the song metadata. Optionnally update the
	infodisplay if the player is currently playing the song that was
	just modified.

	* TableViewController.m ([TableViewController -tableView:tableViewwillDisplayCell:cellforTableColumn:tableColumnrow:rowIndex]) 
	([TableViewController -_addNeededColumns]): use the standard
	colors defined in our new NSColorExtensions extension module.

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor
	+evenRowsBackgroundColor]): new extension module for NSColor
	designed to provide methods for standard colors of rows in our
	NSTableViews.

	* Bundles/WindowsMedia/WindowsMedia.m
	(extractValueFromDescriptor): treat data of type "BYTE_ARRAY" as a
	cString rather than a unicode string.

	* MBResultsPanel.[hm]: new subclass of NSPanel, designed to be
	called by the SongInspectorController when MusicBrainz returns
	more than one result. Displays a list of all the song data that
	were returned, permitted the user to select the one that fits
	best with the one of which he's modifying the info.

2005-06-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_framework/TestNSNumberExtensions.m
	([TestNSNumberExtensions -testTimeStringValue]): added test for
	the timeStringValue extension method to NSNumber.

	* InfoDisplayController.m ([-resetTimerField]) 
	([-setTimerFromTotalSeconds:totalSeconds]): removed those methods
	made useless by the new mechanism used to display the total time
	of the playlist in its own window.

	* TableViewController.m ([TableViewController -deselectAll]): new
	proxy method that calls "deselectAll:" on playlistView.
	([TableViewController -durationOfSelection]): new method that
	returns the total duration of the selected songs as an NSNumber.
	([TableViewController -selectSongsInArray:array]): new method to
	select the songs passed as parameters in the array.
	([TableViewController -setCurrentPlayerSong:newSong]): new method
	to declare the song that is currently playing so that the song
	pointer can be positioned.
	([TableViewController -init]): initializes evenRowsBgColor and
	oddRowsBgColor so that the rows are differenciated more easily.

	* Frameworks/CynthiuneTest/SuperMetaClass.[hm]: new super class
	for all meta objects used in the unit tests. This class implements
	neutral "meta<ivar>" accessors for classes which wouldn't provide
	them or which would provide non-neutral accessors (i.e. accessors
	that perform actions different than just setting the related
	ivar).

	* BundleManager.m ([BundleManager _registerArrayOfClasses]):
	removed method.
	([BundleManager
	-loadBundlesForPath:pathwithFileManager:fileManager]): replaced
	the mechanism that was invoking "bundleClasses" on the main bundle
	classes with one that loads the bundle after "self" is passed as
	observer for the "NSBundleDidLoadNotification", hence invoking the
	new "bundleDidLoad:" method.
	([BundleManager -bundleDidLoad:notification]): new method that
	register the bundle classes by examining the "NSLoadedClasses" key
	of the userInfo dictionary of the notification, removing the need
	for a "bundleClasses" method in the "CynthiuneBundle" protocol.

	* Tests/Cynthiune_app/TestBundleManager.m ([TestBundleManager
	-testRegisterBundle]): removed test.
	([TestBundleManager -testBundleManager]): removed test.

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSArray
	-numberOfValuesBelowValue:value]): new method that returns the
	amount of values contained in self (considered as an array of
	numbers) that are inferior to the value passed as parameter.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.m
	([TestNSArrayExtensions -testNumberOfValuesBelowValue]): test for
	the new "numberOfValuesBelowValue:" method.

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-moveObjectsAtIndexes:indexestoIndex:index]): renamed from
	"moveObjectsAtIndices:toIndex:".

	* Frameworks/Cynthiune/NSIndexSetExtensions.[hm]: removed
	extension module since only MacOSX 10.3 and above provide
	NSIndexSet.

2005-06-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -streamOpen:fileName]): rewind the file
	handle after reading the metadata, so that the beginning is the
	sound won't be clipped.
	([MP +bundleClasses], [MP +bundleDescription]) 
	([MP +bundleCopyrightStrings]): changes to the CynthiuneBundle
	protocol.

	* German.lproj/: added German translation, thanks to Julian Frede.

	* Frameworks/Cynthiune/CynthiuneBundle.h: removed the
	"bundleClasses" method, added bundleDescription and
	bundleCopyrightStrings.

2005-05-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* BundleManager.[hm]: new class that will handle bundle loading,
	registration and general management.

	* Tests/Cynthiune_app/TestBundleManager.m ([TestBundleManager
	-testNew]): unit test for the new BundleManager class.

2005-05-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistTableView.m
	([-draggingSourceOperationMaskForLocal:isLocal]): returns
	NSDragOperationMove | NSDragOperationGeneric explicitly when
	isLocal is YES.

	* Player.m ([Player -setStream:newStream]): no longer care for the
	validity of the stream given as parameter since the
	PlayerController should take care of that.

	* GeneralPreference.m ([GeneralPreference -_initializeSelector]):
	invoke "sizeToFit" and "centerViewHorizontally" on the bundle
	selector.

	* Playlist.m ([Playlist -arrayOfInvalidSongs]): new method that
	replaces delteInvalidSongs by letting the caller invoke
	deleteSongsInArray: with the resulting array.

	* Tests/Cynthiune_framework/TestNSStringExtensions.m
	([TestNSStringExtensions -_createroDir]): new unit tests for our
	NSString extensions.

	* Bundles/WindowsMedia/WindowsMedia.m ([WindowsMedia -readYear]):
	new method required by the Format protocol.
	([NSString +stringWithASFText:textlength:length]): new extension
	method to NSString that parses an UTF-16 field from the ASF headers.
	(convertGUID): convert a binary-stoded GUID to its ASCII
	representation.
	(objectIsOfType): test whether an ASF object matches a specific
	GUID.
	(asfstrndup): strndup for UTF-16 strings.
	(readMetaData): new function to parse ASF header for song
	metadata.

	* Bundles/Timidity/Timidity.m ([Timidity -readTrackNumber]): new method
	required by the Format protocol.

	* Bundles/Ogg/Ogg.m ([Ogg -readYear]): new method
	required by the Format protocol.

	* Bundles/Musepack/Musepack.m ([Musepack -readYear]): new method
	required by the Format protocol.
	[generic] modified to use the new libmpcdec API (rather than
	libmusepack 1.1, which was C++ only).

	* Bundles/Mod/Mod.m ([Mod -readYear]): new method required by
	the Format protocol.

	* Bundles/MP3/MP3.m ([MP -readYear]): new method required by
	the Format protocol.
	([MP -_readStreamMetaData]): modified to take info from the Xing
	header if present and to compute the length of possible non-xing
	vbr files by doing an average for 10 frames.

	* Bundles/FLAC/FLAC.m ([FLAC -readYear]): new method required by
	the Format protocol.

	* Bundles/AudioFile/AudioFile.m ([AudioFile -readYear]): new
	method required by the Format protocol.

	* CynthiuneFadingTextField.[hm]: new subclass of NSTestField that
	gives a fading effect when the text value changes.

	* CynthiuneAnimatedImageView.[hm]: new subclass of NSImageView to
	display a small animation.

	* Frameworks/Cynthiune/utils.m (logRect): modified to use
	NSStringFromRect.
	(fileIsAcceptable): enhanced (fixed) to handle relative symlinks.

	* Frameworks/Cynthiune/Format.h: modified the Format protocol so
	that is requires a readYear method.

	* Frameworks/Cynthiune/NSViewExtensions.m ([NSView
	-arrangeViewRightTo:view]): new extension methods for the NSView
	class: arrangeViewRightTo:, arrangeViewLeftTo: and
	centerViewHorizontally.

	* Song.m ([Song -setTitle:string], [Song -setArtist:string]) 
	([Song -setAlbum:string], [Song -setGenre:string]) 
	([Song -setTrackNumber:string], [Song -setYear:string]): new
	setter methods for use by the new SongInspectorController.
	([Song -_refreshSongInfosFromStream:stream]): when a song doesn't
	have a title, generate it from the new makeTitleFromFilename
	utility function.

	* Song.h: new year ivar that will contain the year of publication
	for the song.

2005-05-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -addSongsInArray:array]) 
	([Playlist -deleteSongsInArray:array]) 
	([Playlist -deleteInvalidSongs], [-lastValidSong]) 
	([-firstValidSong], [-duration]): replaced the method for
	accessing the songs in the list array with an enumerator.
	([Playlist -_nextValidSongInEnumerator:songEnumerator]): new
	method with common code from firstValidSong and lastValidSong,
	taking an NSEnumerator as parameter, previously computed from
	their calling method as appropriate.

2005-05-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -replaceSongsWithArray:array]): new method
	that replaces the content of the playlist with the songs contained
	in the array passed as parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testReplaceSongsWithArray]): added unit test for the new
	replaceSongsWithArray: method.

2005-04-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -firstValidSong]): new method that returns
	the first song marked as valid in the playlist.
	([Playlist -lastValidSong]): new method that returns the last song
	marked as valid in the playlist.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testFirstValidSong]): added unit test for the new firstValidSong
	method.
	([TestPlaylist -testLastValidSong]): added unit test for the new
	lastValidSong method.

	* Playlist.m ([Playlist -addSongsInArray:array]): new method that
	adds the songs contained in the NSArray passed as parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist -testAddSongsInArray]) 
	added unit test for the new addSongsInArray: method.

2005-04-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_app/Meta*.[hm]: generated meta objects
	automatically from a perl script. Those meta objects have the
	abilitity to query their ivars through "metaXX" methods which
	guarantee no influence on them. All of those classes are
	subclasses of SuperMetaClass.

2005-03-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist
	-moveSongsAtIndices:indicestoIndex:index]): moved the core of the
	method to
	Frameworks/Cynthiune/NSArrayExtensions.m:moveObjectsAtIndices:toIndex:.
	We now call that method instead and only check whether the list
	has changed and if we should raise a notification.

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-moveObjectsAtIndices:indicestoIndex:index]): new method, moved
	from ../../Playlist.m:moveSongsAtIndices:toIndex:, that move
	objects indicated in the specified array indexes to the new index.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.m
	([TestNSMutableArrayExtensions -testMoveObjectsAtIndicesToIndex]):
	added unit test for the new moveObjectsAtIndices:toIndex: method.

	* Frameworks/Cynthiune/NSIndexSetExtensions.m ([NSIndexSet
	-adjustedIndexAfterMove:index]): new method, moved from
	../../Playlist.m:_adjustedIndexAfterMove, that returns the offset
	an index should be shifted after the move of the specified
	indexes occurs.

	* Tests/Cynthiune_framework/TestNSIndexSetExtensions.m
	([TestNSIndexSetExtensions -testAdjustedIndexAfterMove]): added
	unit test for the new adjustedIndexAfterMove: method.

	* Playlist.m ([Playlist -validSongBefore:song]): new method,
	similar to songBefore: but that will only return the first valid
	song that is found.
	([Playlist -validSongAfter:song]): new method,
	similar to songAfter: but that will only return the first valid
	song that is found.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testValidSongAfter]): added unit test for the validSongAfter:
	method.
	([TestPlaylist -testValidSongBefore]): added unit test for the
	validSongBefore: method.

2005-02-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist
	-moveSongsAtIndices:indicestoIndex:index]): new method that moves
	a set of songs (contiguous or not) to the index passed as
	parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testMoveSongsAtIndicesToIndex]): added unit test for the
	moveSongsAtIndices:toIndex: method.

2005-02-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSArray
	-subarrayWithObjectsAtIndexes:indexSet]): new method that creates
	a subarray of the current array with the elements indexed in the
	indexset passed as parameter.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.m
	([TestNSArrayExtensions -testSubarrayWithObjectsAtIndexes]): added
	unit test for the subarrayWithObjectsAtIndexes method.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.[hm]: new
	TestCase module for the NSArrayExtensions module in the
	Cynthiune framework.

	* Frameworks/Cynthiune/NSIndexSetExtensions.m ([NSMutableIndexSet
	-addIndexesInArray:array]): new method that add the indexes found
	in the NSNumber objects contained in the array passed as
	parameter.

	* Frameworks/Cynthiune/NSIndexSetExtensions.[hm]: new module
	containing extension methods to the NSIndexSet and
	NSMutableIndexSet classes.

	* Tests/Cynthiune_framework/TestNSIndexSetExtensions.m
	([TestNSIndexSetExtensions -testAddIndexesInArray]): added unit
	test for the addIndexesInArray method.

	* Tests/Cynthiune_framework/TestNSIndexSetExtensions.[hm]: new
	TestCase module for the new NSIndexSetExtensions module in the
	Cynthiune framework.

	* SongInspectorController.m ([SongInspectorController -dealloc]):
	added this method to remove the observer from the
	NSNotificationCenter whenever the SongInspectorController instance
	is freed. Otherwise, the playlistChanged: notification can still
	be posted across different instances.

	* Player.m ([Player -dealloc]): added this method to remove
	the observer from the NSNotificationCenter whenever the Player
	instance is freed. Otherwise, the playlistChanged: notification
	can still be posted across different instances.

	* Playlist.m ([Playlist -dealloc]): added this method to remove
	the observer from the NSNotificationCenter whenever the Playlist
	instance is freed. Otherwise, the playlistChanged: notification
	can still be posted across different instances.
	([Playlist -addSong:song]) 
	([Playlist -insertSong:songatIndex:index]) 
	([Playlist -deleteSong:song], [Playlist -deleteAllSongs]) 
	([Playlist -deleteSongsInArray:array]) 
	([Playlist -deleteInvalidSongs]): added code to post the
	playlistChanged: notification when the list has at least one song
	added or removed.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist -testAddSong]) 
	([TestPlaylist -testInsertSongAtIndex]) 
	([TestPlaylist -testDeleteSong]) 
	([TestPlaylist -testDeleteAllSongs]) 
	([TestPlaylist -testDeleteInvalidSongs]) 
	([TestPlaylist -testDeleteSongsInArray]): ensure the corresponding
	methods post a playlistChanged: notification when something has
	changed in the list.

	* Playlist.m ([Playlist -setDelegate:object]): new method to
	remember the object that will receive the playlistChanged:
	notification message.
	([Playlist -insertSong:songatIndex:index]): new wrapper method
	around the insertObject:atIndex: method from NSMutableArray.
	([Playlist -indexOfSong:song]): new wrapper method around the
	indexOfObject: method from NSArray.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testSetDelegate]): added unit test for the setDelegate method.
	([TestPlaylist -testInsertSongAtIndex]): added unit test for the
	insertSongAtIndex method.
	([TestPlaylist -testIndexOfSong]): added unit test for the
	indexOfSong method.

2005-02-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -deleteSongsInArray:array]): new method
	deleting the songs contained in an array passed as parameter.
	([Playlist -deleteInvalidSongs]): new method that checks that all
	songs in the playlist have a status equal to "SongOK" and removes
	them otherwise.
	([Playlist -songAtIndex:index]): returns the Song specified by the
	index passed as parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testDeleteInvalidSongs]): added unit test for the
	deleteInvalidSongs method.
	([TestPlaylist -testDeleteSongsInArray]): added unit test for the
	deleteSongsInArray: method.
	([TestPlaylist -testSongAtIndex]): added unit test for the
	songAtIndex: method.

2005-02-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_app/MockSong.[hm]: new module containing a
	subclass of Song, designed to give access to ivars.

	* Tests/Cynthiune_app/MockPlaylist.[hm]: new module containing a
	subclass of Playlistm designed to give access to ivars.

	* Playlist.m ([Playlist -deleteAllSongs]): new method to remove
	all the songs from the array.
	([Playlist -songAfter:song]): new method returning the song
	after the one passed as parameter.
	([Playlist -songBefore:song]): new method returning the song
	before the one passed as parameter.
	([Playlist -numberOfSongs]): returns the number of songs in the
	playlist.
	([Playlist -duration]): return an NSNumber with the total duration
	of the playlist in seconds.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist -setUp]):
	initialize 3 mock songs that can be used during the tests.
	([TestPlaylist -testDeleteAllSongs]): added unit test for the
	deleteAllSongs method.
	([TestPlaylist -testSongBefore]): added unit test for the
	songBefore: method.
	([TestPlaylist -testSongAfter]): added unit test for the
	songAfter: method.
	([TestPlaylist -testnumberOfSongs]): added unit test for the
	numberOfSongs method.
	([TestPlaylist -testduration]): added unit test for the duration
	method.

	* Playlist.m ([Playlist -firstSong]): new firstSong method.
	([Playlist -lastSong]): new lastSong method.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testFirstSong]): added unit test for the firstSong method.
	([TestPlaylist -testLastSong]): added unit test for the lastSong
	method.

	* Playlist.m ([Playlist -addSong:song]): new addSong: method.
	([Playlist -deleteSong:song]): new deleteSong: method.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testAddSong]): new unit test for the addSong method.
	([TestPlaylist -testDeleteSong]): new unit test for the deleteSong
	method.

	* Tests/Cynthiune_app/TestPlaylist.[hm]: new unit testsuite for
	the Playlist object.

	* Tests/Cynthiune_app: new unit testsuite for the Cynthiune
	application files.

2005-02-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_framework/Testutils.m ([Testutils -init]): 
	new init method, initializing the elements of the test that have
	only to be initialized once during the run of the testsuite.
	([Testutils -dealloc]): new dealloc methods cleaning up the
	elements initialized in init.
	([Testutils -testlogRect]): added unit test for the logRect
	function.
	([Testutils -testinvertBytesInBuffer]): improved the test by
	checking the error messages output by NSLog during a wrong
	invocation of invertBytesInBuffer.
	([Testutils -testconvert8to16]): added unit test for the
	convert8to16 function.
	([Testutils -testmakeTitleFromFilename]): added unit test for the
	makeTitleFromFilename function.

2005-02-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.h: the appWindow ivar was renamed to
	playerWindow.

	* CynthiuneController.m (initWMWindowTitleSize): new hacking
	function to determine the height of the title bar on X11.
	([CynthiuneController -awakeFromNib]): set WindowsTitleSize and
	WindowsBorderSize here, depending on the value returned by
	GSHandlesWindowDecorations(). All of the above happens only on
	GNUstep.

	* SongInspectorController.m ([-awakeFromNib]): the level of the
	inspectorPanel is now set to "NSFloatingWindowLevel" instead of
	"NSModalPanelWindowLevel", since it looks more appropriate;

	* Frameworks/Cynthiune/utils.m (reverseComparisonResult): return
	NSOrderedSame if result == NSOrderedSame;

	* Tests/Cynthiune_framework/Testutils.m ([Testutils
	-testfileIsAReadableDirectory]): added unit test for the
	fileIsAReadableDirectory function.
	([Testutils -testinvertBytesInBuffer]): added unit test for the
	invertBytesInBuffer function.
	([Testutils -testreverseComparisonResult]): added unit test for
	the reverseComparisonResult function.

2005-02-10  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSongTitleCell.m: made subclass of CynthiuneTextCell.
	([CynthiuneSongTitleCell -setPointerImage:pointerImage]): new
	accessor method to specify the pointer image.
	([CynthiuneSongTitleCell -copyWithZone:theZone]): made conform to
	the NSCopying protocol.

	* Tests/Cynthiune_framework/Testutils.m: initial unit test module
	for the utils.m in the Cynthiune framework.

	* Frameworks/Cynthiune/NSArrayExtensions.[hm]: new module
	containing extension methods to the NSArray and NSMutableArray
	classes.

	* Frameworks/Cynthiune/utils.m (makeTitleFromFilename): new
	function to the determine the title of a song from its filename.

	* Bundles/Timidity/Timidity.m: new Timidity format bundle that
	accepts midi files and reads them through a piped timidity
	process.

	* CynthiuneTextCell.[hm]: new subclass of NSTextFieldCell that
	accepts a specific highlight color parameter.

	* PlaylistController.m ([PlaylistController -_updateStatusLabel]):
	new method that displays the amount of songs in the playlist, the
	total time of the playlist and the time of the selection if songs
	are selected.
	([PlaylistController -_addSongsFromArray:songArraywithDir:aDirectory]) 
	([PlaylistController -removeSelectedSongs:sender]) 
	([PlaylistController -removeAllSongs:sender]) 
	([PlaylistController -cleanupPlaylist:sender]) 
	([PlaylistController -openSongFromNSApp:aSong]) 
	([PlaylistController -tableSelectionIsChanging:aNotification]): 
	invoke [self _updateStatusLabel] whenever something has changed in
	the playlist.
	([-_resetTimeDisplay:aTimer], [-_updateDisplayResetTimer]) 
	([-_updateSelectionTimeDisplay]): removed the methods which were
	part of the previous mechanism to display the time of the
	selection in the timerField.

	* PlaylistController.h: the "Player" protocol no longer exists.
	Removed references to it. Added a new "playlistStatusLabel" ivar.

2005-01-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiunePauseButton.m ([-sendAction:action:object]): removed
	overriden method since the animation has to be started when the
	button state changes.

	* PlaylistController.h: removed the pauseAnimationTimer and
	animationStatus ivars.

	* PlaylistController.m ([-_animatePauseButton]) 
	([-_startPauseAnimation], [-_stopPauseAnimation]): removed methods
	since they were moved into the new CynthiunePauseButton class.
	([PlaylistController -playerPlaying:aNotification]): no longer
	invoke "setImage:" on pauseButton.
	([-playerPaused:aNotification]): no longer invoke
	_startPauseAnimation and set the state of pauseButton to YES.
	([PlaylistController -playerResumed:aNotification]): no longer
	invoke _stopPauseAnimation and set the state of pauseButton to NO.
	([PlaylistController -playerStopped:aNotification]): no longer
	invoke "setImage:" on pauseButton.

	* CynthiunePauseButton.[hm]: new subclass of NSButton that is
	acting like a toggle button but alternates between its image and
	alternateImage with a timer when activated. This gives a blinking
	effect to the active button.

	* CynthiuneSongTitleCell.[hm]: new class replacing
	CynthiuneSongPointerCell and with a different meaning in that it
	is a subclass of NSTextField. Large portions of this code taken or
	inspired from GNUMail by Ludovic Marcotte <ludovic@sophos.ca>.

	* TableViewController.m ([TableViewController -init]): allocate
	and initialize the 4 NSColor * ivars.
	([TableViewController -dealloc]): release them here.
	([TableViewController -_addNeededColumns]): removed the previous
	CynthiuneSongPointerCell and replace the cell used for the song
	title with an instance of the new CynthiuneSongTitleCell class.
	([TableViewController -_addNeededColumns]): changed the "playlist"
	and "duration" identifiers to "song" and "time" for consistency.
	([TableViewController -awakeFromNib]): set the cell spacing to
	0.0.
	([-_postTableDoubleClickNotification]) 
	([-_postTableSelectionDidChangeNotification]) 
	([-_postTableSelectionIsChangingNotification]): removed those
	methods so avoid a useless method call.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	use the column identifiers rather than their number to identify
	them.
	([TableViewController
	-tableView:tableViewwillDisplayCell:cellforTableColumn:tableColumnrow:rowIndex]):
	take the class change into account with regard to the "song"
	column and choose an appropriate background color depending on the
	row number and its selection status.

	* TableViewController.h: added 4 new NSColor * ivars that will be
	used to draw the background color of the data cells:
	evenRowsBgColor, oddRowsBgColor, evenSelectedRowsBgColor,
	oddSelectedRowsBgColor.

2005-01-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController -init]):
	load the SongInspector nib from here.

	* PreferencesController.m ([PreferencesController
	-setBundleView:bundlePrefsView]): tells bundleViewBox to refresh
	itself.

	* PlaylistController.m ([PlaylistController -_startTimeTimer]):
	release the timer after it's invalidated.
	([PlaylistController -_startPauseAnimation]): new method that
	creates an animation timer and sets it to call _animatePauseButton.
	([PlaylistController -_stopPauseAnimation]): new method that
	invalidates and releases the animation timer for the pause button.
	([PlaylistController -_animatePauseButton]): new method to animate
	the pause button by changing its image alternatively.
	([PlaylistController -playerPlaying:aNotification]): no longer
	calls setActiveSong on tableViewController but tells it to show
	the song pointer.
	([PlaylistController -playerStopped:aNotification]): tells
	tableViewController to hide the song pointer.

	* PlaylistController.h: new pauseAnimationTimer and
	animationStatus ivars.

	* PlaylistController.m ([PlaylistController -awakeFromNib]): no
	longer load the SongInspector nib from here.

	* TableViewController.m ([-setActiveSong:song]): removed method.
	([-songIsActive:aSong]): removed method.
	([TableViewController -setShowSongPointer:show]): new setter
	method for the new displaySongPointer ivar.
	([TableViewController -_addNeededColumns]): prepend a new column
	identified as "pointer", having a CynthiuneSongPointerCell as its
	data cell.
	([TableViewController
	-tableView:aTableViewwillDisplayCell:cellforTableColumn:aTableColumnrow:rowIndex]): new delegate method that tells the pointer cell in the pointer column to display the image if the row parameter is equal to the number of the song being played and if the player is active.

	* TableViewController.h: new displaySongPointer BOOL ivar.

	* TableViewController.m ([TableViewController
	-setShowSongPointer:show]): setter for the new songPointer ivar.

	* TableViewController.h: added songPointer BOOL ivar.

	* CynthiuneInfo.plist: added file types handled by the WindowMedia
	and the Musepack format bundles.

	* CynthiuneController.m (GSHandlesWindowDecorations): new function
	which indicates, under GNUstep, whether GNUstep or the window
	manager handles the window decoration. This is needed to determine
	the correct position of the windows.
	([CynthiuneController -init]): initialize WindowsTitleSize and
	WindowsBorderSize depending on the value returned by
	GSHandlesWindowDecorations. The values are valid for WindowMaker.
	([CynthiuneController
	-_computeDeltaYOfFrame:mainFramewithFrame:aFrame]): compute the
	values by taking the WindowsTitleSize and WindowsBorderSize into
	account.
	([CynthiuneController -windowWillClose:aNotification]) 
	([CynthiuneController -_initWindowsPosition]): the windows
	identifiers are changed to "PlayerWindow" and "PlaylistWindow" in
	the preferences.

	* Frameworks/Cynthiune/utils.m (logRect): print a label associated
	with the corresponding value.

	* Player.m ([Player -stop]): send a PlayerResumedNotification when
	paused to tell the observer we are no longer paused.

	* CynthiuneSongPointerCell.[mh]: new NSCell subclass to indicate
	the song being played.

2005-01-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([-toggleSongInspector:sender]): new method
	replacing [-showSongInspector:].
	([PlaylistController -songInspectorWasShown:aNotification]): set
	state of songInspectorMenuItem to off.

	* SongInspectorController.m ([SongInspectorController
	-setDelegate:anObject]): added SongInspectorWasShownNotification
	and replaced SongInspectorWasClosedNotification with
	SongInspectorWasHiddenNotification.
	([SongInspectorController -toggleDisplay]): new method replacing
	hide and show.
	([SongInspectorController -_updateFields]): update filenameField
	with the full filename of the song being inspected.

	* SongInspectorController.h: added filenameField ivar.

	* Song.m ([Song -year]): new stub method that shall return the
	year of the song in the future.

	* SongInspectorController.m ([SongInspectorController
	-awakeFromNib]): set self as delegate for inspectorPanel.
	([SongInspectorController -setDelegate:anObject]): new method.
	([SongInspectorController -delegate]): new method.
	([SongInspectorController -setSong:newSong]): update the song ivar
	and the inspector fields only if newSong != song.
	([SongInspectorController -show]): new method to show the
	inspector panel.
	([SongInspectorController -hide]): new method to hide the
	inspector panel.
	([SongInspectorController -windowWillClose:aNotif]): delegate
	method that sends a notification to our delegate when the panel is
	closing.

	* PlaylistController.h: added songInspectorMenuItem ivar.

	* PlaylistController.m ([PlaylistController -init]): set self as
	delegate for songInspectorController.
	([PlaylistController -awakeFromNib]): set state of
	songInspectorMenuItem to off.
	([PlaylistController -showSongInspector:sender]): new action
	method requesting the songInspectorController to show the
	inspector window and where the state of songInspectorMenuItem is
	set to on.
	([PlaylistController -songInspectorWasClosed:aNotification]): new
	delegate method received when the song inspector is closing, where
	we set the state of songInspectorMenuItem back to off.

	* SongInspectorController.[h,m]: new class implementing the
	controller API for the new Song inspector. It currently take cares
	of updating the different fields but:
	- it only supports one song at a time;
	- it can't save modifications yet.

	* Frameworks/Cynthiune/utils.m (findStringStart, findStringEnd) 
	(trimmedString): removed functions since the NSString API has the
	stringByTrimmingSpaces method.

	* Frameworks/Cynthiune/Output.h: removed the outputBytes method
	from the Output protocol.

	* Bundles/Esound/OSS.h: removed the bytes ivar.

	* Bundles/Esound/OSS.m ([-outputBytes]): removed method since
	it's no longer required in the Output protocol.

	* Bundles/Esound/Esound.h: removed the bytes ivar.

	* Bundles/Esound/Esound.m ([-outputBytes]): removed method since
	it's no longer required in the Output protocol.

2005-01-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OutputSkeleton/: new bundle directory containing the
	skeleton for an output bundle.

2004-12-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): invokes
	numericallyCompare: on the trackNumber NSString rather than
	calling compareStringsNumerically().

	* Frameworks/Cynthiune/NSStringExtensions.m ([NSString
	-numericallyCompare:aString]): new category method replacing
	compareStringsNumerically() in utils.m.
	([NSString]): new class module containing extensions to NSString.

	* Frameworks/Cynthiune/utils.m (findStringEnd): end may not be
	less than the beginning of the string.
	(trimmedString): end being < start means the trimmed string will
	be of length 0. This solves a bug that was causing the new
	allocation to fail because of an excessive request of memory and
	hence a segfault during strncpy.
	(compareStringsNumerically): removed function.

2004-12-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-playerPlaying:aNotification]): invokes setActiveSong: instead of
	selectRow: on tableViewController. This initiates our change
	in the way we mark the song that is currently playing.

	* TableViewController.m ([TableViewController
	-setActiveSong:song]): new method replacing selectRow:, instead of
	an integer, it takes a Song argument. This name change refocusses
	on the correct purpose of this method, which is to mark the
	current song as being played in the playlist view.
	([TableViewController -songIsActive:aSong]): new name for
	songIsSelected:. Renamed for the reason mentionned above.
	([TableViewController -updateView]): invokes setActiveSong: instead
	of selectRow:.

	* Playlist.m ([Playlist -selectSong:aSong]): new method similar to
	selectSongNumber but with a Song parameter.
	([Playlist -currentSong]): revived method.

	* Bundles/Mod/Mod.m ([Mod +initialize]): added
	MODPLUG_ENABLE_OVERSAMPLING to the modplug flags.

2004-12-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (returnTag): new macro that invokes the
	relevant taglib function.

	* utils.m (trimmedString): new utility function that returns a new
	string equal to the one passed as parameter but where we make sure
	any starting and ending spaces are removed.

	* Player.m ([Player -play]): invoke _playLoopIteration after
	sending the PlayerPlayingNotification so that we make sure the
	player is in a consistent state whenever something bad happens and
	triggers another notification.

2004-12-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WindowsMedia/WindowsMedia.m ([WindowsMedia
	+canTestFileHeaders]): we now declare that we are able to test our
	file headers and content correctly.
	([WindowsMedia +streamTestOpen:fileName]): invoke the functions in
	our avifile bindings to test the validity of the file passed as
	parameter.

	* Bundles/WindowsMedia/CWMFile.cpp (_testASFHeaders): new function
	to test if a file has a Microsoft ASF header.
	(WMFileOpen): now invoke _testASFHeaders and test its result
	before opening the file.
	(WMFileClose): now invoke delete on the passed WMFile parameter.
	(WMFileAudioStreamCount): new wrapper function around
	IReadFile::AudioStreamCount().

2004-12-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Musepack/Musepack.m (ShiftSigned): made inline.
	(CopyBuffer): idem.
	([-readNextChunk:bufferwithSize:bufferSize]): copied code from the
	WindowsMedia format bundle to make sure the output buffer will
	never be overflood, through the use of an internal intermediary
	buffer.

	* Bundles/MP3/MP3.h: removed "opened" ivar.

	* Bundles/MP3/MP3.m ([MP -_resetIVars]): initialize all ivars here
	so that the same code is shared in init and streamClose.
	General: replaced dependency on libid3tag with one on taglib,
	which is much better and simpler.

	* Player.m ([Player -chunkFinishedPlaying]): invoke
	_playLoopIteration only when all requests are completed.

	* Bundles/Musepack/*.cpp: C++ binding code for the libmusepack
	library.

	* Bundles/Musepack/Musepack.[mh]: new format class
	bringing the ability for Cynthiune to read Musepack (MPC) files.

2004-12-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WindowsMedia/CWMFile.[h,cpp]: new binding modules
	provided to glue the C++ AviFile API and the WindowsMedia ObjC
	code.

	* Bundles/WindowsMedia/WindowsMedia.[h,m]: new format class
	bringing the ability for Cynthiune to read ASF and WMA files.

2004-12-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/FormatSkeleton/: new bundle directory containing the
	skeleton for a format bundle.

2004-12-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -_playLoopIteration]): increment requests when
	a chunk is sent to the output bundle.
	([Player -_playLoopIteration]): post a songended notification only
	when the amound of requests is 0.
	([Player -chunkFinishedPlaying]): decrement the amount of
	requests.

	* Player.h: added a new "requests" ivar.

	* Bundles/Esound/Esound.h: removed unused "currentChunk" ivar.

	* Bundles/MP3/MP3.m (seekOffset): returns -1 if the end of file is
	found before any non-zero character could be found.
	([MP +streamTestOpen:fileName]): returns NO if the result of
	seekOffset is -1.

2004-11-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistTableView.m ([PlaylistTableView
	-draggingSourceOperationMaskForLocal:isLocal]): new overriden
	method to permit DnD activity between Cynthiune and other
	applications.

2004-11-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUmakefile: release 0.9.4.

	* Song.m ([Song -_fileWasModified]): set status to
	SongFileNotFound if attributes is nil.

	* MailService.m ([MailService -composeBugReport]): instead of
	using the DO mechanism of OpenStep, use the NSURL API and the
	"mailto:" protocol.

2004-11-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -pausePlayer:sender]) 
	([PlaylistController -previousSong:sender], currentSongNumber) 
	([PlaylistController -changeTimeDisplay:sender]): player is always
	instantiated now and no longer can be "nil".

	* MailService.m ([MailService +instance]): mailService declared as
	static. Don't recreate if already exists.

	* MailService.[hm]: new class to deal with the local OS's mail
	application in order to compose a bug report about Cynthiune. 

	* PlaylistController.m ([PlaylistController -init]): set self as a
	delegate of the playlist.
	([PlaylistController -toggleMute:sender]): the state change is
	reflected on both the Player/Mode/Mute menu item as well as the
	mute toggle button.
	([PlaylistController -toggleShuffle:sender]): the state change is
	reflected on both the Player/Mode/Shuffle menu item as well as the
	shuffle toggle button.
	([PlaylistController -toggleRepeat:sender]): the state change is
	reflected on both the Player/Mode/Repeat menu item as well as the
	repeat toggle button.
	([PlaylistController -addSongs:sender],
	[PlaylistController -addSongsFolders:sender]): new action methods,
	triggered by the application menu.
	([PlaylistController -addSong:sender]): modified to call the
	above action methods.
	([PlaylistController -removeSelectedSongs:sender],
	[PlaylistController -removeAllSongs:sender],
	[PlaylistController -cleanupPlaylist:sender]): new action methods,
	triggered by the application menu.
	([PlaylistController -removeSong:sender]): modified to call the
	above action methods.
	([PlaylistController -saveList:sender]) 
	([PlaylistController -saveListAs:sender]): new action methods,
	triggered by the application menu.
	([PlaylistController -saveListFromPopupMenu:sender]): new method
	derived of the old "saveList" method, modified to call the
	above action methods.
	([PlaylistController -playlistChanged:aNotification]): new
	delegate method that saves the playlist states and update the
	Player.

	* Playlist.m: added a new notification:
	"PlaylistChangedNotification".
	([Playlist -setDelegate:anObject], [Playlist -delegate]): new
	methods.

2004-11-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlayerPreference.[hm]: new "PlayerPreference" class, designed to
	handle preferences for the Player.

	* PlayerController.[hm]: new "PlayerController" class, designed to
	hold the controlling code specific to the Player initially put in
	PlaylistController.

	* CynthiuneController.m (localizeMenu): new static function
	implementing a new mechanism for translation menu labels. Instead
	of replacing them with static entries, they are scanned and
	replaced with their translation. This makes the code lighter and
	removes the constraint of keeping up with the different where to
	change the localized strings whenever it happens.
	([-_initMenuLabels]),
	([-_setStrings:stringsforSubmenu:menuwithOffset:offset]),
	([-_setStrings:stringsforSubmenu:menu]),
	([-_setStrings:stringsforMenu:menu]: removed methods.

2004-11-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:tvwriteRows:rowstoPasteboard:pboard]): removed #ifdef
	and only declare elements of type CynthiunePlaylistDragType to the
	pasteboard. The rest will be provided through
	pasteboard:ProvideDataForType:.
	([TableViewController -pasteboard:pboardprovideDataForType:type]):
	implemented this delegate method from the NSPasteBoard API to
	provide elements of type NSFilenamesPboardType when requested.
	([TableViewController -tableView:tvvalidateDrop:infoproposedRow:rowproposedDropOperation:dropOperation]):
	check the dragging source before requesting elements of a specific
	type to the pasteboard. This way, we make sure we control the right
	type of letting the underneath API to decide for us. This is the
	right way to do things and solves a couple of problems with our
	previous implementation.

2004-11-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OSS/OSSPreference.m ([OSSPreference
	-_initDefaults]): use a BOOL "defaultsInitted" to check whether
	this method was executed.
	([OSSPreference -_init]): the defaultsInited ivar was removed.
	([OSSPreference -awakeFromNib]), ([OSSPreference -dspDevice]):
	call _initDefaults.

	* Bundles/Esound/EsoundPreference.m ([EsoundPreference
	-_initDefaults]): use a BOOL "defaultsInitted" to check whether
	this method was executed.
	([EsoundPreference -_init]): the defaultsInited ivar was removed.
	([EsoundPreference -awakeFromNib]), ([EsoundPreference
	-socketIsTCP]), ([EsoundPreference -tcpHostConnectString]): call
	_initDefaults.

	* Player.m ([Player -_ensureOutput]): when the output bundle has
	changed, we need to set rate an channels to 0 and call
	_reInitOutputIfNeeded so that we make sure the new output is
	initialized correctly.

2004-10-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -status]): call _readInfos, so that whenever this
	method is called, we make sure file operations occur that
	initialize the status correctly.

	* GeneralPreference.m ([GeneralPreference -init]): call
	_initDefaults to initialize the managed values with correct
	defaults so that they are accessible all the time.

2004-09-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_initPlaylistPopups]): new "Cleanup" entry in the "Remove" menu.
	([PlaylistController -removeSong:sender]): if the selected menu is
	"Cleanup", send "removeBadEntries" to the playlist.

	* Playlist.m ([Playlist -removeArrayOfSongs:anArray]): cast
	[_regularList count] to signed int so that currentSongNumber can
	be -1 and let the condition be computed correctly.
	([Playlist -removeBadEntries]): new method to discover and remove
	songs from which the "status" message does not return SongOK.

2004-09-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-validRequestorForSendType:returnType:]): don't check the
	returnType.
	([PlaylistController
	-writeSelectionToPasteboard:pboardtypes:types]): don't check that
	tableViewController has any selection since it's done within
	validRequestorForSendType:returnType:.
	([-_extensionIsAcceptable:fileExtension]): removed method (see below).
	([PlaylistController -panel:sendershouldShowFilename:fileName]):
	reduce the use of variables.
	([PlaylistController
	-_oPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]):
	synchronize the defaults as soon as the key is set.
	([PlaylistController
	-_dirOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]):
	synchronize the defaults as soon as the key is set.
	([PlaylistController
	-_startOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]):
	synchronize the defaults as soon as the key is set.
	([PlaylistController -_ejectOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]): 
	synchronize the defaults as soon as the key is set.

	* FormatTester.m ([FormatTester -extensionIsSupported:extension]):
	new method derived from
	PlaylistController:-[_extensionIsAcceptable:] and designed to
	replace it.

	* CynthiuneController.m ([-_initServices]): removed method.
	([CynthiuneController +initialize]): register
	NSFilenamesPboardType as a service menu sendtype.
	([-validRequestorForSendType:sendTypereturnType:returnType]):
	forward the invocation to playlistController.

	* TableViewController.m ([TableViewController
	-getFirstSelectedRow]): new name for "getSelectedRow". Now returns
	an int instead of an unsigned int so that -1 can be given when no
	song is selected. Check that the playlist actually contain any
	song since -[NSTableView selectedRow] does not void its selection
	when the list is emptied...
	([TableViewController -getFirstSelectedSong]): new name for
	"selectedSong".
	([TableViewController -getSelectedSongs]): new name for
	"getSelection". Ensure that the playlist is populated, otherwise
	returns an empty array.
	([TableViewController -getSelectedSongsAsFilenames]): new name for
	"getSelectionAsFilenames". Ensure that the playlist is populated,
	otherwise returns an empty array.
	([TableViewController -songIsSelected:aSong]): new name for
	"isSongInSelection:".

2004-09-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -setStream:newStream]): when a new nil stream
	is set post the "PlayerSongEndedNotification" so that the
	PlaylistController knows the song will not be read. This is not
	very clean and needs to be rectified lated.

	* Song.m ([Song -encodeWithCoder:encoder]): call _readInfos to
	make sure we save initialized data.

2004-09-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (decodeInputBuffer): function semantics
	changed to manage only buffer decoding and returning a status code
	about the decoded stream chunk.
	(calcInputRemain): the third argument was a pointer to an int we
	had to modify from inside this function. Now we return that value
	instead.
	([MP -_readStreamMetaData]): completed method to use
	decodeInputBuffer, the same way readNextChunk:withSize: does so
	that we can have a correct file parsing for metadata.

2004-09-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([Esound
	-prepareDeviceWithChannels:numberOfChannelsandRate:sampleRate]):
	reinitialize the output socket if open. That is the only way to
	modify the stream settings with ESD...

	* TableViewController.m ([TableViewController
	-doubleClick:sender]): take the double-click into account only if
	a real row (> -1) was clicked, otherwise it might just be the
	column header and we don't want the player to start in that case.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	take the column number into account instead of its identifier
	since, on OS X, this method is called before the id's are
	available and it generates a warning.
	([TableViewController -awakeFromNib]): disallow column selection,
	hoping the GNUstep team will fix NSTableView one day...

	* Player.m ([Player -_reInitOutputIfNeeded]): if [<output>
	prepareDeviceWithChannels:andRate:] returns 'NO', the new values
	are not retained.

2004-09-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUmakefile: release 0.9.3a.

	* Bundles/MacOSX/MacOSXPlayer.m, Bundles/MacOSX/MacOSXPlayer.h:
	converted to the new Output protocol. This version is far cleaner
	than what used to be.

	* Player.m ([Player -stop]): when stopped, awaitingNewStream
	should be set to NO.

2004-09-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OSS/OSS.m ([OSS
	-prepareDeviceWithChannels:numberOfChannelsandRate:sampleRate]):
	directly update the device if open.
	([OSS -closeDevice]): set the "dsp" ivar to nil when released, so
	that we can know whether it is open or not.

	* Player.m ([Player -_ensureOutput]): set rate and channels to 0
	when another Output bundle is instantiated to that we make sure
	its device gets correctly initialized.
	([Player -play]): start the play loop only if calling "openDevice"
	on the output instance returns "YES", otherwise ignore the
	request. Something else should be done, like displaying an error
	message or something like that but we're not there yet.

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): typo.

	* Bundles/OSS/OSS.m: updated to conform the new Output protocol by
	mixing code from the ancien OSS and the new Esound bundle.

2004-09-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-playerStopped:aNotification]): set currentPlayerSong to nil.

	* Player.m ([Player -chunkFinishedPlaying]): call
	_playLoopIteration if not paused AND if not stopped.

	* PlaylistController.m ([PlaylistController
	-_updatePlayer:force]): send a "setStream" message instead of
	"setSong" to the Player object, by previously calling
	"openStreamForSong" on the relevant Song. Besides, since the
	"song" message is no longer available, we use the new
	"currentPlayerSong" variable to keep track of what is currently
	playing.

	* Song.m ([Song -_refreshSongInfosFromStream:stream]): channels
	and rate are no longer read from the streams.
	([-channels]): removed method.
	([-rate]): removed method.
	([Song -initWithCoder:decoder]): "channels" and "rate" keys are no
	longer decoded from the NSKeyedArchive.

	* Player.m ([Player -_playLoopIteration]): new name for
	"_sendChunkToOutput".
	([Player -play]): simplified a lot since we no longer play "Song"
	objects but objects conforming to the "Format" protocol (streams).
	([Player -setStream:newStream]): simplified a lot the the same
	reason as mentionned above. Besides, restart the play loop if the
	new ivar "awaitingNewStream" is set.
	([Player -_playLoopIteration]): set "awaitingNewStream" to yes
	when the song is finished playing so that setStream can restart
	the loop when a "SongFinishedPlayingNotification" was sent to the
	Player controller.

	* Bundles/Esound/Esound.m
	([-_writeCompleteNotification:aNotification]): no longer emit a
	notification but directly sends the "chunkFinishedPlaying" message
	to the parent player (following the recent change in the "Output"
	protocol).

	* Output.h: "setDelegate:" and "delegate" removed. Added
	"setParentPlayer:" instead. Also, modified the OutputDelegate
	informal protocol to remove the NSNotification argument to the
	"chunkFinishedPlaying" method.

	* Bundles/XMMSInput/XMMSInput.m ([XMMSInput -readDuration]):
	return an unsigned int instead of a NSNumber.

	* Player.m ([Player -_ensureOutput]): separate the conditions in
	two level-1 blocks. Drop output if it's class is different than
	the one selected in the preferences and set it to nil. Afterward,
	output is tested against nil and generated if needed. Besides, the
	output bundle is initialized with the rate and channels if needed.
	([Player -setSong:aSong]): send the
	"prepareDeviceWithChannels:andRate:" message only if output is
	non-nil and the current song's channels and rate values are not
	those accounted for output.

2004-09-10  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -setSong:aSong]): simplified a lot by removing
	the code used when playing the song since it's the role of the
	output bundles to determine whether the device has to be reopened
	or not.
	([Player -play]): the "prepareDeviceWithChannels:andRate:" message
	is called from the "setSong:" method so we don't need to call it
	from here anymore.
	([Player -_ensureOutput]): 

	* PlaylistController.m ([PlaylistController -_setPlayerSong:]):
	removed method.
	([PlaylistController -_updatePlayer:force]): instead of calling
	"_setPlayerSong", set the Song directly. If the player is paused,
	"unpause" it. Reinit the progress slider through the new
	"_initProgressSliderFromSong:" method.
	([PlaylistController -_initProgressSliderFromSong:aSong]): new
	method to initialize the ProgressSlider depending on the Song
	length and "seekability".

	* FormatTester.m ([FormatTester +formatTester]),
	GeneralPreference.m ([GeneralPreference +instance]),
	PreferencesController.m ([PreferencesController
	+preferencesController]): initialize the singleton with the "new"
	message instead of "alloc" and "init".

2004-09-09  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Output.h: new interface describing the Output protocol, which
	must now be implemented by the Output bundles in place of the old
	Player protocol.

	* Bundles/Esound/Esound.m, Bundles/Esound/Esound.h: made conform
	the the "Output" protocol, described in Output.h.

	* Player.h: the "isRunning" method was renamed to "playing".

	* PlaylistController.m ([PlaylistController -init]): player is now
	instantiated here, since it is no longer a variable object.
	([-_initializePlayer]): this method was removed.

	* Player.m, Player.h: Player is now a real object with a
	centralized handling of the streams and the output of their
	content through the output bundles. This refactoring cleans up the
	code and reduces the amount of code needed to write an output
	bundle, which now must conform to the "Output" protocol, instead
	of "Player".

	* Format.h: the argument to seek: is called "seconds" now.

	* Playlist.m ([Playlist -saveToDefaults]): use NSKeyedArchiver to
	save the playlist.
	([Playlist -loadFromDefaults]): use NSKeyedUnarchiver to load the
	default playlist. This way their metadata no longer need to be
	read through the song format bundles. This speeds up the loading of
	Cynthiune for large playlists. 

	* Song.m ([Song -encodeWithCoder:encoder]) 
	([Song -initWithCoder:decoder]): implementation of the NSCoding
	protocol for archiving song data.

2004-08-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GeneralPreference.m ([GeneralPreference -_initDefaults]): the
	playlistFormat variable was querying the OutputBundle preference
	value instead of PlaylistFormat.
	([GeneralPreference -preferredOutputClass]): new name for
	preferredPlayerClass.

2004-08-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -_refreshSongInfosFromStream:stream]): the Format
	protocol was changed back. readDuration returns an unsigned int
	again instead of an NSNumber, so we convert the unsigned int
	explicitly here now.

2004-08-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/XMMSInput/XMMSInput.m: first attempt at providing an
	XMMS plugin wrapper bundle.

2004-08-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/FLAC/FLAC.m (writeCallback): moved code of
	_refillBufferWithData:withSize: here to avoid a useless method
	call.

	* Song.m ([Song -_fileWasModified]): test whether a file was
	modified between two invocations of this method, by checking its
	date and filesize.
	([Song -_readInfos]): use the private method _fileWasModified
	instead of _infosRead to detect whether to update a Song's
	metainfos.
	([Song -init]): initialize status ivar to SongFileNotFound.
	([Song -status]): new accessor.
	([Song -_refreshSongInfosFromStream:stream]): new method called
	when everything else is fine within _readInfos.
	([-_readInfos]): only refreshed the Song's status. No error
	message is passed here.
	([-setFilename:aFilename]): don't test the Song format here.
	([Song -playlistRepresentation]): compose a correct playlist
	representation title, depending on the status.

2004-08-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/FLAC/FLAC.m: new output bundle for decoding Free
	Lossless Audio Codec encoded sound files.

2004-07-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.[mh]: MainController class renamed to
	CynthiuneController.

	* CynthiunePopUpButton.m ([CynthiunePopUpButton
	-addItemWithTitle:aTitle]): removed _updateEnabled method to avoid
	useless code and a useless method call.

	* Bundles/Esound/Esound.h: BUF_SIZE set to 176400.

	* Bundles/OSS/OSS.h: BUF_SIZE set to 176400 (1 second @ 44kHz/16
	b/stereo).

	* PlaylistFile.m ([PlaylistFile _M3UContentWithArray:]): the
	format string should contain "%@" instead of "%d" for the song
	durations since they are now NSNumber's.

2004-07-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -playlistRepresentation]): removed useless
	"format" variable.

2004-07-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -duration]): invoke _readInfos before returning
	the value.
	([Song -openStreamForSong]): make stream autoreleased only if
	it opens correctly, otherwise release it directly.

	* Bundles/Ogg/Ogg.m ([Ogg +streamTestOpen:fileName]): don't report
	when the returned NSFileHandle is nil since it could happen with
	any missing file.

	* utils.m (strndup): made non-static (for MacOS X only).

	* Player.m ([-initWithSong:aSong]): removed useless method.
	([+playerWithSong:aSong]): removed useless method.

2004-07-07  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* utils.m (compareStringsNumerically): new function to compare
	numerical strings waiting for the GNUstep implementation of the
	NSNumericSearch option in NSString.

	* TableViewController.m ([TableViewController +initialize]): nc is
	now a static global variable instead of an ivar. It is initialized
	here.

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]):
	trackNumber is an NSString, so we cannot really use compare: on
	it. Instead we use our new utils function
	"compareStringsNumerically".
	([Song -reverseCompareByDuration:aSong]): directly calls the
	target method instead of passing through our ascending comparison
	method.

	* PlaylistController.m ([-stopPlayer:sender]): the player ivar is
	released in the playerStopped: notification method, which is
	invoked after "stop" was sent to the player, so there is no
	need to do it here.
	([PlaylistController -playerSongEnded:aNotification]): same thing
	here.

	* Player.m ([Player +playerWithSong:aSong]): the "song" variable
	really should be named "player"...

	* Bundles/Esound/EsoundPreference.m: class EsoundPreference split
	from Esound.m.

2004-07-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]):
	we call the NSNumber method timeStringValue on duration instead of
	the old utility timeStringFromSeconds().

	* Playlistcontroller.m ([PlaylistController
	-_updateSelectionTimeDisplay]), ([PlaylistController
	-playerPlaying:aNotification]): duration is now an NSNumber *,
	code modified accordingly.

	* Song.m ([Song -init]): the duration ivar is now a NSNumber.
	([Song -compareByPlaylistRepresentation:aSong]): the tracknumber
	are compared directly using the compare: method provided by the
	NSNumber class.
	([Song -reverseCompareByPlaylistRepresentation:aSong]) 
	([-reverseCompareByDuration:aSong]): we now use the new
	reverseComparisonResult() function from utils.h instead of
	providing our code.

	* InfoDisplayController.m ([-hideTextFields], [-hideTextFields]):
	code from this methods removed and directly included within the
	hide and show methods.
	([InfoDisplayController -_setTimerFromUnsignedInt:timer]): new
	private method to update the timer field with the integer passed
	as parameter.

	* CynthiuneFileHandle.m: new child class of NSFileHandle for
	handling asynchronous I/O on file descriptors.

	* NSNumberExtensions.m: new module containing extension method to
	the NSNumber class.
	([NSNumber -timeStringValue]): new implementation of old utils.m's
	timeStringFromSeconds. Removed test on (seconds != 0) since the
	result will be valid anyway.

	* utils.m (timeStringFromSeconds): moved to new
	NSNumberExtensions.m module.
	(reverseComparisonResult): new function for sorting methods.

	* Bundles/AudioFile/AudioFile.m ([AudioFile -readDuration]):
	returns an NSNumber * as expected by the modified Format protocol.

	* Bundles/Ogg/Ogg.m ([Ogg -readDuration]): returns an NSNumber *
	as expected by the modified Format protocol.

	* Bundles/Mod/Mod.m ([-readDuration]): returns an NSNumber * as
	expected by the modified Format protocol.

	* Bundles/MP3/MP3.m (seekOffset, testRiffHeader, testMP3Header) 
	(calcInputRemain): changed methods with those names to static
	inline functions. iRemain passed as pointer so that we can modify
	it directly.
	(fillPCMBuffer): removed intermediary variables to make code
	shorter.
	([-readDuration]): returns an NSNumber * as expected by the
	modified Format protocol.

	* Format.h: readDuration now returns an NSNumber *.

2004-07-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (_decodeInputBuffer): new function split from
	readNextChunk:withSize: to make code cleaner and shorter. Its
	exact purpose is to decode the data fed to it as parameter and
	return an the size of the decoded data or an appropriate return
	code if needed.

2004-06-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (_translateBufferToPCM, _fillPCMBuffer) 
	(_audioLinearDither): new static functions that replace the
	methods with the same name, this makes the bundle use a bit less
	of CPU time since no message resolution is done.

	* Song.m ([Song -filename]): original purpose put in new method
	"shortFilename", now replaces "fullFilename".

2004-06-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist
	-sortByPlaylistRepresentation:descending]): changed the signature
	of this method to accept a BOOL parameter indicating whether we
	want the resulting order to be descending or not. It selects the
	appropriate comparison method selector accordingly.
	([Playlist -sortByDuration:descending]): same thing here.

	* Song.m ([Song -reverseCompareByPlaylistRepresentation:aSong]):
	new method that calls compareByPlaylistRepresentation: and reverse
	the result.
	([Song -reverseCompareByDuration:aSong]): same thing here for
	compareByDuration:.

	* TableViewController.m ([TableViewController -init]): added two
	ivars, sortedInPlaylist and sortedInDuration so that we know when
	to sort the playlist in ascending or descending order.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	take sortedInPlaylist and sortedInDuration into account when
	sorting. One should be reversed and the other should be set to NO.
	([TableViewController -_acceptDroppedFiles:aFilesListatRow:row]):
	set both to NO when a song file was dropped.
	([TableViewController -_acceptDroppedRows:aRowsListatRow:row]): 
	set both to NO when a song was dragged from within the list and
	dropped.

	* Bundles/OSS/OSSPreference.m: class OSSPreference split from
	OSS.m.

2004-06-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OSS/OSS.m: entirely rewritten (except for
	OSSPreferences) to use the asynchronous interface of NSFileHandle
	instead of threads.

	* PlaylistController.m ([PlaylistController -_startTimeTimer]):
	the timer should run in the NSEventTrackingRunLoop too.

	* Player.h: renamed "startPlayLoop" and "StopPlayLoop" to "play"
	and "stop" respectively. Made the Player protocol slightly lighter
	by removing the initWithSong: and audioInit: method prototypes.

	* Player.m ([Player +load]): initialize the global variable nc
	here.
	([Player -initWithSong:aSong]): new initializer.
	([Player +playerWithSong:aSong]): new constructor based on the
	above.

	* Bundles/MP3/MP3.m ([MP
	-readNextChunk:bufferwithSize:bufferSize]): returns -1 when an
	error occurs.

	* CynthiuneWindow.m: new subclass of NSWindow designed to let the
	user whether he wants textured windows or not on MacOS X.

	* FormatTester.m ([FormatTester -formatClassForFile:file]):
	Class values can't be "nil" but "NULL".
	([FormatTester -formatClassAtIndex:formatNumber]): same thing.

	* GeneralPreference.m ([GeneralPreference -windowsAreTextured]):
	new method to test whether windows should be displayed as regular
	or textured windows.
	([GeneralPreference -_initDefaults]): initialized the new toggle
	related to the textured windows.
	([GeneralPreference -texturedWindowsChanged:sender]): new callback
	method.

2004-06-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GeneralPreference.m ([GeneralPreference
	-_noDefaultOutputModuleAlert]): new method to display an alert
	panel when no output module is configured.
	([GeneralPreference -preferredPlayerClass]): calls the above when
	playerClass == nil.

	* PreferencesController.m ([PreferencesController
	-loadPreferencesWindowAndSelectMenuEntry:entry]): new method.

	* CynthiunePopUpButton.m ([CynthiunePopUpButton -_updateEnabled]):
	new class derived from NSPopUpButton, that just test whether there
	is more than one item in the menu to enable its popup button.

2004-06-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -isSeekable]): cache the result in an ivar by
	calling _readInfos.
	([Song -_readInfos]): (new name for -readInfos), test if a stream
	is seekable to avoid multiple openings.
	([Song -setFilename:aFilename]): cache the Format class from here
	to avoid multiple openings and testings, this slightly improves
	the opening of long playlists.

	* Player.m: class PlayerBase renamed to Player.

	* FormatTester.m: -fileType renamed to -formatNumberForFile,
	-classForFile: renamed to formatClassForFile:, and
	-classForFileType: renamed to formatClassAtIndex.
	([FormatTester
	-formatClass:formatClassacceptsFileExtension:extension]): new method.
	([FormatTester -formatClassForFileExtension:extension]): new method.

	* Format.h: added a new protocol method "canTestFileHeaders"
	returning YES if the format bundle has a way of testing the file
	type by checking its headers. Otherwise FormatTester determines
	the right bundle to use by looking at its extension.

	* Bundles/Mod/Mod.m ([Mod +streamTestOpen:fileName]): don't test
	file loading since the only way we can do this is by loading
	entire files in memory and by relying on the result returned by
	ModPlug_Load, which seems to not be always accurate.

	* Bundles/Mod/Mod.m ([Mod -init]): removed.
	([Mod +load]): initialize the library settings just after the
	Mod bundle is loaded in memory. The "settings" ivar is replaced
	with a local variable.

2004-06-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController
	-initializeWidgets]): new method that take cares of initializing
	the widgets before they get displayed;

2004-06-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/AudioFile/AudioFile.m ([AudioFile
	-_getAudioFileIDOfType:idTypewithMax:max]): new private method to
	retrieve meta data tags from the input file.
	([-readTitle]): returns the title of the song if found.
	([AudioFile -readArtist]): returns the name of the artist of the
	song if found.

	* PreferencesController.m ([PreferencesController
	-loadPreferencesWindow]): test whether the prefs window is visible
	before displaying it so that many invocations of
	loadPreferencesWindow will only display the window once.

	* utils.m (strndup): the algorithm was wrong since it was copying
	one more char than requested when len was < the length of the
	string.

2004-06-09  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -readInfos]): determine the title from the
	filename if not present.

2004-06-08  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-panel:sendershouldShowFilename:fileName]): new delegate method to
	test the filenames case-insensitively;

	* Song.m ([Song -playlistRepresentation]): use a NSMutableString
	instead of an NSString.

2004-06-07  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* *.m Bundles/*/*.m: renamed _L macro to LOCALIZED since MacOS X
	already defines such a name in its system libraries.

	* utils.m (strndup): added our own version of strndup for MacOS X
	which seems to be lacking it.
	(NSStandardLibraryPaths): idem.

2004-06-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/AudioFile/AudioFile.m: new module to read uncompressed
	sound files.
	([AudioFile +load]): disable error string output by setting the AF
	error handler to NULL.

	* utils.m (convert8to16): new function designed to convert 8 bit
	sample frames to 16 bit ones.

2004-06-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -startPlayer:sender]):
	startPlaying renamed.
	([PlaylistController -stopPlayer:sender]): stopPlaying renamed.

	* TableViewController.m ([TableViewController
	-_acceptFilesInPasteboard:pboard]): test whether a dragged
	filename is a directory before accepting it.

	* utils.m (fileIsAcceptable): new function, taken from a method
	with the same name in PlaylistController.m;
	(fileIsAReadableDirectory): new function to test whether a
	filename is both readable and a directory;

	* Bundles/Ogg/Ogg.m ([Ogg -streamOpen:fileName]): if no error is
	caught, the NSFileHandle should be retained to avoid a crash in
	the close callback.

2004-05-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([Esound -threadWillExit]): release lock
	only when no thread is active.

	* Bundles/OSS/OSS.m ([OSS -stopPlayLoop]): release the fileHandle
	to avoid leaks.
	([OSS -threadWillExit]): release lock only when no thread is
	active.

2004-05-08  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([Esound -threadWillExit]): 
	* Bundles/OSS/OSS.m ([OSS -threadWillExit]): release the lock to
	avoid a leak.

2004-05-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController
	-validRequestorForSendType:sendTypereturnType:returnType]): on
	GNUstep, execute the same method on the playlistController to make
	sure it declares as a valid requestor. MacOSX doesn't need this.

	* PlaylistController.m ([PlaylistController
	-writeSelectionToPasteboard:pboardtypes:types]): write selection
	to pasteboard only when the selection is not empty.
	([PlaylistController -validRequestorForSendType:returnType:]):
	declare as valid requestor only when the selection is not empty.

	* TableViewController.m ([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	invoke saveToDefaults on the playlist when sorted.

	* Bundles/MP3/MP3.m ([MP -readComment:comString]): when the string
	id is not found, return @"".

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): new
	comparison method for sorting by artist, album, track number,
	title and finally by filename.
	([Song -compareByDuration:aSong]): new comparison method for
	sorting by duration.

	* Playlist.m ([Playlist -sortByDuration]) 
	([Playlist -sortByPlaylistRepresentation]): new
	method to sort the playlist.

	* TableViewController.m ([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	new method to trigger the sorting of the playlist depending on the
	column header that was clicked.
	([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): the "time" column in now identified with "duration", for consistency.

2004-04-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([-loadFromDefaults]): new method to migrate the
	default playlist in the NSUserDefaults database to the default in
	the user's Library/Cynthiune.
	([-saveToDefaults]): save the playlist in the user's
	Library/Cynthiune/DefaultPlaylist.pls.

	* utils.m (invertBytesInBuffer): new function taken from Esound.m
	to swap bytes in an even-size buffer.
	(_linesFromContent): work on a copy of the line where the ending
	character (\n or \r) is replaced with a 0.

	* Bundles/Mod/Mod.m ([Mod
	-readNextChunk:bufferwithSize:bufferSize]): invert bytes in buffer
	on big-endian architectures.

	* PlaylistFile.m ([PlaylistFile -load]): check that fileLines is
	not nil, otherwise do not fill the playlist at all.

	* MainController.m ([MainController
	-loadBundlesInSystemDirectories:aFileManager]): use
	NSStandardLibraryPaths().

	* utils.m (linesOfFile): return nil if the file could not be
	opened.

	* Bundles/Mod/Mod.m ([Mod +bundleClasses]): new libmodplug-based
	plugin bundle to read MODs, XMs, and many many more .....

2004-04-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistFile.m ([PlaylistFile -_fillPlaylistWithArray:anArray]):
	don't release the returned song since it's autoreleased.

	* Bundles/Ogg/Ogg.m (oggReadFunc,oggSeekFunc, oggCloseFunc,
	oggTellFunc): new callback function for ov_read_callbacks().
	([Ogg -streamOpen:fileName]): use an NSFileHandle object instead
	of a FILE pointer, pass it as the datasource argument to
	ov_read_callbacks().

	* Bundles/OSS/OSS.m ([OSSPlayerThread -playerThread:dict]):
	release the stream when the thread is ending.
	Same changes as in Esound bundle (see below).

	* PreferencesController.m ([PreferencesController
	-setBundleView:bundlePrefsView]): don't release the returned view
	since it's now autoreleased.

	* Bundles/Esound/Esound.m ([-dealloc]): host is never used.
	Release the lock.
	([EsoundPlayerThread -setStream:aStream]): retain the stream if
	non-nil.
	([EsoundPlayerThread -flushOutputBuffer:dict]): display an error
	message related to the esd socket only if it failed three times to
	reconnect.

	* Playlist.m ([Playlist -loadFromDefaults]): don't release the
	returned song since it's now autoreleased.

	* GeneralPreference.m ([GeneralPreference -preferenceSheet]):
	autorelease the returned view.

	* Bundles/MP3/MP3.m ([MP -readComment:comString]): return an UTF8
	encoded strings.

	* Song.m ([Song -displayRepresentation]): renamed to
	playlistRepresentation. Uses our NSString ivars directly instead
	of their UTF8 or C representation.
	([Song +songWithFilename:aFilename]): return an autoreleased
	object.
	([Song -openStreamForSong]): stream should be autoreleased.

	* Bundles/OSS/OSS.m ([OSSPlayerThread -dealloc]): new method to
	make sure the stream is closed and released when the thread is
	deallocated.

	* Song.m ([Song -filename]): simplified method by using short
	conditions rather than an intermediary variable.
	([-fullFilename]): idem.
	([Song -displayRepresentation]): use UTF8String rather than
	cString on the string components.

	* Bundles/*/*.m (general): we define the NSLocalLocalizedString
	macro for the bundle so that the localized string can be found in
	the plugin directory structure rather than by finding it in the
	main bundle.

	* *.m */*/*.m (general): we now use _L as the localization macro
	all across the project. This macro calls UTF8String on GNUstep, as
	well as NSLocalizedString in the main bundle and
	NSLocalLocalizedString (see above) for the plugin bundles.

	* utils.m (UTF8String): new method to obtain string declared as
	UTF-8 for localized strings. This permit us to use UTF8 encoded
	Localizable.strings files when running in a non-utf8 environment.

2004-04-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController
	-setReverseTimer:reversed]): accessor to reverseTimer.

	* PlaylistController.m ([PlaylistController
	-changeTimeDisplay:sender]): new method to reverse the time
	display when the timer field is clicked. Originally in
	InfoDisplayController.m.

	* MainController.m ([MainController -_parseArguments]): check that
	no argument beginning with "-" is taken into account.

	* GeneralPreference.m ([GeneralPreference -_initDefaults]): set
	the default output plugin to a reasonable default depending on the
	platform.

	* PlaylistController.m ([PlaylistController
	-_removeSelectedSongs]): new method extracted from removeSong: to
	make code cleaner.

2004-04-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:tvwriteRows:rowstoPasteboard:pboard]): MacOSX seems to
	only accept one type of dragged elements at a time...

	* Song.m (general): accessors return a copy of the attributes
	instead of their direct reference.

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	do not release the selection since it is autoreleased.
	([PlaylistController -_updatePlayer:force]): do not initialized
	the player automatically, display a warning if it's equal to nil.

2004-04-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([EsoundPlayerThread
	-_invertBufferBytes]): new method for big endian machines about
	which libesd does not give a damn.

	* InfoDisplayController.m ([InfoDisplayController
	-setTimerFromTotalSeconds:seconds]): new method to display the
	total given as parameter in the timer field in bold.
	([InfoDisplayController -resetTimerField]): empties the timer
	field and reset its font back to normal.
	([InfoDisplayController -timerIsReversed]): return the value of
	reverseTimer.

	* PlaylistController.m ([PlaylistController
	-_resetTimeDisplay:aTimer]),
	([PlaylistController -_updateDisplayResetTimer]),
	([PlaylistController -_updateSelectionTimeDisplay]): new methods
	meant to be used when the tableSelectionIsChanging notification is
	triggered so as to show the total time for the selected songs and
	to reset the timer field if needed (when the player is not
	running).

	* MainController.m ([MainController
	-_registerArrayOfClasses:classes]): takes the array of classes for
	each bundle as argument and test all of them with the different
	protocol managers.

	* CynthiuneBundle.h: Cynthiune bundle should now include this file
	to permit the MainController to know all of their classes. Ogg,
	MP3, Esound, OSS, MacOSXPlayer bundles updated.

2004-04-23  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong], [Song -readInfos]): use
	"release" instead of "autorelease" to free the stream from memory.

	* PlaylistFile.m (general): redone the interface to act as a
	regular class rather than a method provider.

	* PlaylistController.m (general): removed loadDefaultList and
	saveDefaultList methods.
	([PlaylistController -saveList:sender]): the callback data passed
	to the sheet is a struct containing the integer for the return
	code but also a saveDir NSString, so that we can directly save the
	result to the correct directory.

	* Playlist.m ([Playlist -dealloc]): new method.
	([Playlist -getSongsAsFilenames]): new method to obtain the
	filenames of the songs listed in the playlist.
	([Playlist -loadFromFile:aFilename]): new method that instantiates
	a PlaylistFile object to load itself from.
	([Playlist -saveToFile:aFilename]): new method that instantiates
	a PlaylistFile object to save itself it.

2004-04-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -_appWindowDidMove]) 
	([MainController -_playlistWindowDidMove]): new methods extracted
	from windowDidMove: to make code cleaner.

	* InfoDisplayController.m ([InfoDisplayController -init]): new
	method to initialize the class attributes rather than in
	awakeFromNib.

	* MainController.m ([MainController -_initWindowsPosition]): new
	method extracted from awakeFromNib to make code cleaner.

2004-04-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.h (NSObject): "songlist" attribute renamed
	to "playlist".

	* TableViewController.m ([TableViewController
	-doubleClick:sender]): the song selected in the playlist is set
	from here rather than in the notification signal in
	PlaylistController.

	* MainController.m ([MainController
	-setPlaylistWindowVisible:isVisible]): new method to replace
	showPlaylistWindow and hidePlaylistWindow for consistency with the
	standard *step APIs.

	* PlaylistController.m (general): references to the
	playlistWindow and the playlistSwitch moved to the MainController
	class as well as all associated method (WindowDidMove,
	WindowDidResize, togglePlaylist, showPlaylistWindow,
	hidePlaylistWindow, repositionWindow, mainHasNewFrame...).
	([PlaylistController -playerSongEnded:aNotification]): we release
	the player whenever we get at the end of the playlist.
	([PlaylistController -stopPlaying:sender]): we release the player
	when stop is pressed.
	([PlaylistController -loadDefaultList]): we don't update the
	tableview anymore since this method is called only once and before
	the tableview is initialized.
	([PlaylistController -_updatePlayer:force]): we are now the only
	method to initialize "player" when it does not exist.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread -dealloc]): close
	the stream before releasing it.

2004-04-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* FormatTester.m ([FormatTester +formatTester]): major cleanup,
	all class methods converted to instance methods. This new method
	returns a singleton.

	* TableViewController.m ([TableViewController
	-_songsInRows:rows]): returns an array of songs associated to the
	rows contained in the array passed as argument.
	([TableViewController
	-tableView:tvwriteRows:rowstoPasteboard:pboard]): fille the
	pasteboard with NSFilenamesPboardType elements.
	([TableViewController -_acceptFilesInPasteboard:pboard]): new
	method splitted from  -tableView:validateDrop:proposedRow: to test
	whether the list of files that's being dragged are of a readable
	format.
	([TableViewController
	-tableView:tvacceptDrop:inforow:rowdropOperation:op]): if the
	draggingSource is our table view, query the
	CynthiuneSongListDragType elements from the pasteboard, otherwise
	query the NSFilenamesPboardType.
	([TableViewController -setPlaylist:aPlaylist]): retain and release
	the received playlist.

	* Playlist.m ([Playlist -songAtNSIndex:anIndex]): return the song
	associated to the specified index (passed as NSNumber).

	* GeneralPreference.m ([GeneralPreference -awakeFromNib]):
	* Bundles/Esound/Esound.m ([EsoundPreferences -awakeFromNib]):
	* Bundles/OSS/OSS.m ([OSSPreferences -awakeFromNib]): new method.
	Translate labelled widgets.

	* Bundles/MP3/MP3.m ([MP -readStreamMetaData]): test for XING VBR
	header and compute duration subsequently.

2004-04-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -init]): added init method.

2004-04-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -_initMenuLabels]): the
	services menu is defined in Gorm.
	([MainController
	-_setStrings:stringsforSubmenu:menuwithOffset:offset]): new method
	to translate the Windows menu properly at the correct offset after
	the windows list.

	* GeneralPreference.m ([GeneralPreference
	+windowsInformationAreSaved]): new method that returns whether
	windows location saving is set in the preferences.
	([GeneralPreference
	+saveInformation:aWindowforWindow:windowName]): new method to
	store the window state in the NSUserDefaults database.
	([GeneralPreference
	+restoreInformation:aWindowforWindow:windowName]): new method as
	above but to restore and apply that information.
	([GeneralPreference -saveWindowsInformationChanged:sender]): new
	delegate method to set or unset the parameter deciding of the
	windows location saving mechanism.

	* PlaylistController.m ([PlaylistController
	-mainHasNewFrame:aFrame]): initialize the playlist window position
	from the preferences if required.
	([PlaylistController -windowWillClose:aNotification]): save the
	playlist window position from the preferences if required.
	([PlaylistController -_recheckIfIsStuck:aWindow]): new method to
	make windowDidMove: and windowDidResize: smaller.
	([PlaylistController
	-writeSelectionToPasteboard:pboardtypes:types]): new delegate
	method to fill the pasteboard buffers with the selected song
	filenames when a service is invoked.

	* MainController.m ([MainController
	-_setStrings:stringsforMenu:menu]):
	([MainController -_setStrings:stringsforSubmenu:menu]): new
	methods splitted from _initMenuLabels;
	([MainController -_initServices]): new method to list the services
	which accept filenames as parameters.
	([MainController -awakeFromNib]): restore the main window saved
	state if required in the preferences.
	([MainController -windowWillClose:aNotification]): save the main
	window position, size and state if required in the preferences.
	([MainController -validRequestorForSendType:returnType:]):
	delegate method to let NSApplication dispatch the services
	communication messages to the correct object.

	* TableViewController.m ([TableViewController
	-getSelectionAsFilenames]): new method to return the filename of
	the songs that are selected.

	* PlaylistTableView.m ([PlaylistTableView
	-dragImageForRows:dragRowsevent:dragEventdragImageOffset:dragImageOffset]):
	new subclass of NSTableView for providing the correct icon when
	one or more songs are being dragged...

2004-04-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController -_timeColumnWidth]):
	new method to size the time column progammatically depending on
	the translation for "Time".
	([TableViewController -addNeededColumns]): removed useless
	"aFrame" var.

	* PlaylistController.m ([PlaylistController
	-_initPlaylistPopups]): the NSPopupButton's are repositioned after
	their resizing.

2004-04-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -awakeFromNib]): the main
	window is now centered before being displayed.

	* GeneralPreference.m ([GeneralPreference -contentView]): 
	* Bundles/Esound/Esound.m ([EsoundPreferences -contentView]): 
	* Bundles/OSS/OSS.m ([OSSPreferences -contentView]): closing the
	bundle window is useless.

	* PreferencesController.m ([PreferencesController
	+loadPreferencesWindow]): make prefs a global variable so that we
	can control whether the prefs window is already displayed.

2004-04-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MacOSX/MacOSXPlayer.m (manage_oggproblem): removed
	obsoleted method.
	([MacOSXPlayer -init]): initialize timer, totalBytes and
	bytesPerSec(new) to 0.
	([-streamRaiseOpenErrorException:errMsg]): removed obsoleted
	method.
	([MacOSXPlayer -timer]): lastTickSeconds attribute renamed to
	"timer".

	* PlaylistController.m ([PlaylistController
	-_initPlaylistPopups]): call sizeToFit on our popups so that we
	make sure their widths is correct after localization.
	([PlaylistController -_runDirOpenPanel:oPanel]),
	([PlaylistController -_runOpenPanel:oPanel]): use
	beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo: on GNUstep and MacOSX.

	* MainController.m ([MainController
	-registerBundleClass:aBundle]): new method split from
	loadBundlesForPath:withFileManager:

2004-04-10  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PreferencesController.m ([-writeDictionaryForClass:aClass]):
	removed method.

	* Bundles/Ogg/Ogg.m ([Ogg -streamOpen:fileName]): replaced
	#include's with #import's. Import external files before Ogg.h.

	* Bundles/Ogg/Ogg.h: removed imports from file header.

	* PlaylistFile.m ([PlaylistFile +_parsePLSFile:fileLines]): use
	the C api to determine the beginning of the line instead of
	NSString's.

	* Bundles/MacOSX/MacOSXPlayer.m: updated to the NEW bundle and
	player protocols.

	* Bundles/MP3/MP3.m ([MP +_testMP3Header:buffer]):
	use BYTE_ORDER instead of __BYTE_ORDER.

	* GeneralPreference.m ([GeneralPreference -contentView]): 
	* Bundles/OSS/OSS.m ([OSSPreferences -contentView]): 
	* Bundles/Esound/Esound.m ([EsoundPreferences -contentView]): 
	use "release" instead of "dealloc" to avoid crashing.

	* TableViewController.m ([NSTableView
	-dragImageForRows:event:dragImageOffset:]): override this method
	to display the "note(s)" drag icon.
	([TableViewController -awakeFromNib]): add self as an observer for
	the NSViewDidFrameNotification of our parent's parent's, the
	scrollView.
	([TableViewController -scrollViewDidResize:aNotif]): new method to
	resize our columns when needed.
	([TableViewController -addNeededColumns]): add a title to identify
	our columns.

2004-04-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PreferencesController.m ([PreferencesController
	-setBundleView:bundlePrefsView]): different but better algorithm
	for displaying the prefs page.

	* GeneralPreference.m ([GeneralPreference -initializeSelector]):
	when no output bundle was found, display "None" and disable the
	widget.
	([GeneralPreference -initializeWithDict:aDict]): initialize the
	defaults output bundle from the selector only *if* the bundle list
	is not empty.

	* MainController.m ([MainController -_initMenuLabels]): menus on
	MacOSX and GNUstep are different so we have to write a
	double-method.

2004-03-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): if the file
	can't be opened, returns 'NO'.

	* MainController.m ([MainController
	-loadBundlesInLocalDirectory:aFileManager]): computes the Bundle
	directory for the Application directory instead of hard-coding it.

	* Bundles/MP3/MP3.m ([MP +_testMP3Header:buffer]): added support
	for MPEG 2.5 files.

2004-03-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +_seekOffset:_f]): new method to return
	the first-non zero character of a stream.
	([MP +_testRIFFHeader:bufferinFile:_fwithOffset:offset]): new
	method that tests whether a RIFF file contains an MP3 stream.
	([MP +_testMP3Header:buffer) new method split from
	+streamTestOpen: to test a basic MPEG audio header.

2004-03-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): we do now
	provide support for MP2 and MPEG 2 Layer 2/3 streams. "So many
	standards to choose from...".

2004-02-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): we do now
	provide support for RIFF-encapsulated MPEG and MPEG Layer 3
	streams.

2004-02-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([EsoundPreferences
	-selectTcpBtn:sender]): set the text fields visibily enabled.
	([EsoundPreferences -selectUnixBtn:sender]): set the text fields
	visibily disabled.

2004-02-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -_initMenuLabels]): set
	submenu titles too.

2004-02-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* utils.m (logRect): new function to display an NSRect's
	coordinates.

	* PlaylistController.m ([PlaylistController -saveDefaultList]):
	synchronize defaults when saving playlist.
	([PlaylistController -_addSongsFromOPanel:oPanel]): update default
	playlist when new files are added.
	([PlaylistController -_addDirSongsFromOPanel:oPanel]): idem.
	([PlaylistController -removeSong:sender]): idem, when removing
	songs.

	* PreferencesController.m ([PreferencesController
	+loadPreferencesWindow]): initialize prefs window title for I18N;
	([PreferencesController -setBundleView:bundlePrefsView]): new
	way of positioning preference subviews.

	* GeneralPreference.m ([GeneralPreference
	+registerPlayerClass:aClass]): display the warning regarding
	bundles only when it's real.

	* MainController.m ([MainController -_initMenuLabels]): new method
	to initalize i18nized menu labels.

2004-02-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-windowDidResize:aNotification]): new method to avoid positioning
	window disgracefully after it's resized (with isStuck is YES).

2004-02-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_updatePlayer:force]): updatePlayer now takes a BOOL argument
	'force'. Also, was renamed to "_updatePlayer:".
	([PlaylistController -tableDoubleClick:aNotification]): force
	updatePlayer to restart the current song when double-clicked.
	([PlaylistController -playerSongEnded:aNotification]): when repeat
	is on, do repeat the song even if it's the only one. Otherwise,
	reinitialize the playlist position and stop.

2004-01-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	don't go to the next song when the song being played is not
	selected.
	([PlaylistController -_initButtonImages]): new shuffle button;

2004-01-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -parseArguments]): new method
	to add song filenames given as command-line parameters to the
	playlist;

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	fixed a subtle bug that was preventing the shuffle mode from
	working properly. When deleting a song, the next song in the real
	list, rather than in the shuffle list, was selected.
	([PlaylistController -_initButtonImages]): new repeatButton taken
	into ccount.

2004-01-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Ogg/Ogg.m ([Ogg +streamTestOpen:fileName]): don't
	display error when the file tested is just not a vorbis stream.

2004-01-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	test if playlist is non-empty before removing any element.

	* Bundles/dummy/dummy.m ([dummyPlayerThread -playerThread:dict]):
	don't crash when stopping player.

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): implement a
	real test on file headers for both little- and big-endian
	machines.

2004-01-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_fileIsAcceptable:fileName]): new method to test whether a file
	exists, is a regular file or a symlink to a regular file.
	([PlaylistController
	-_addSongsFromArray:songArraywithDir:aDirectory]): accepts an
	optional directory name to prepend to the filenames.

	* Bundles/dummy/dummy.m: new output bundle, outputting to no
	device for debugging purpose.

	* PlaylistController.m ([PlaylistController -_initButtonImages]):
	added "playlist-show" and "playlist-hide" as button images.

2004-01-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m: copyright infos updated + portability
	#ifdef's.

	* MainController.m: General: portability "#ifdef NeXT_PDO"'s and
	related code. 
	([MainController -loadBundlesInLocalDirectory:aFileManager]):
	simplified local bundle loading for Openstep/Win32.

	* Bundles/Ogg/Ogg.m ([Ogg +errorText:error]): new class method to
	replace lastErrorText. Used in streamTestOpen:.
	General: portability "#ifdef NeXT_PDO"'s and related code.

2004-01-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Ogg/Ogg.m ([Ogg -streamClose]): it seems ov_clear
	already calls free().

2003-12-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong]): uses NSFileManager's
	fileExistsAtPath: method instead of access().

2003-12-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.h: togglePause and toggleMuted changed respectively to
	setPaused/paused and setMuted/muted.

2003-12-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneInfo.plist: release 0.9.

	* GNUmakefile (APP_NAME): added VERSION variable and set it to 0.9.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread
	-playerThread:dict]): check streamToRelease and close + release if
	non-nil.
	([EsoundPlayerThread -setStream:aStream]): if streamToRelease is
	already allocated, we wait for the thread loop to release it.

	* Bundles/OSS/OSS.m: same as above.

	* PlaylistController.m ([PlaylistController
	-songCursorChange:sender]): update the timer depending on the
	chosen position so that the user see an indication of where (s)he
	is within the song.
	([PlaylistController -toggleMute:sender]): initialize the player
	if it's not running so that we can mute it even when nothing has
	played yet.
	([PlaylistController -songCursorChange:sender]): the time throttle
	is really active now.
	([PlaylistController -updatePlayer]): display info for the actual
	player song so that we don't show invalid informations since we
	could be called twice if a stream is invalid.

	* Playlist.m ([Playlist -insertSong:newSong:aPos]): increase
	currentSongNumber when aPos <= to it.
	([Playlist -moveSongsWithRows:aRowsListto:newPos]):
	save current song and restore currentSongNumber at the end.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread -seek:aPos]): same
	as below.

	* Bundles/OSS/OSS.m ([OSSPlayerThread -seek:aPos]): new method:
	seek in the stream and update totalBytes.

	* Bundles/Ogg/Ogg.m ([Ogg -isSeekable]): we call ov_seekable and
	return its result.
	([Ogg -seek:aPos]): Ogg's are seekable.

	* Bundles/MP3/MP3.m ([MP -isSeekable]): pseudo method always
	returning YES.
	([MP -seek:aPos]): MP3's are seekable.

	* Player.h: impose a new "seek:" method to Player classes.

	* Format.h: impose new "- isSeekable" and "seek:" methods to
	Format classes.

	* Song.m ([Song -readInfos]): don't read infos of file that can't
	be opened.
	([Song -isSeekable]): new method to verify that the position in
	the song can be changed.

	* MainController.m ([MainController -appWindow]): new method to
	return the player window.

	* GeneralPreference.m ([GeneralPreference
	-playlistFormatChanged:sender]): new method/callback to save the
	specified playlist format.

2003-12-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -updatePlayer]):
	update the progressSlider only at song change.

	* TableViewController.m ([TableViewController
	-_acceptDroppedRows:aRowsListatRow:row]): reselect all previously
	selected songs, not just the first and last ones.

	* PlaylistController.m ([PlaylistController
	-windowDidMove:aNotification]): fixed windows stickyness by
	testing the condition that applies for each axis.
	([PlaylistController -removeSong:sender]): sets the
	currentSongNumber to the first selected song or, if the player is
	running, to the song that is being played.
	([PlaylistController -playerStopped:aNotification]): don't select
	the first song when stopped playing.

2003-12-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -saveList:sender]):
	defaults entry for saving playlists is now
	"DefaultPlaylistDirectory" instead of "NSDefaultSaveDirectory" for
	exactness.

	* utils.m (linesOfFile): refactoring: previous method
	"+_linesFromContentL" from PlaylistFile.m.
	Added proper copyright notice.

	* PlaylistFile.m ([PlaylistFile
	+savePlaylist:anArraytoFile:aFile]): new method to convert and
	save the array of songs.
	([PlaylistFile +_PLSContentWithArray:anArray]) and
	([PlaylistFile +_M3UContentWithArray:anArray]): new methods to
	convert an array of songs, return an NSString with the playlist in
	the appropriate format.
	([PlaylistFile +_linesFromContent:content]): manage DOS-formatted
	files.

	* GeneralPreference.m ([GeneralPreference
	+preferredPlaylistFormat]): new method to determine the user's
	preferred playlist format to use when saving the playlist.

	* PlaylistController.m ([PlaylistController -saveList:sender]):
	new method to save current playlist.
	([PlaylistController -init]): new attribute "playlistFilename" set
	to nil.

	* Bundles/OSS/OSS.m: aligned code with recent changes in Esound
	bundle.

	* Bundles/Esound/Esound.m ([Esound -setSong:aSong]): "seconds"
	attribute no longer used, computed when getSeconds is called.

	* PlaylistController.m ([PlaylistController -awakeFromNib]):
	disable progressSlider by default.
	([PlaylistController -updatePlayer]): en-/disable the
	progressSlider depending on the song "seekability".

	* Song.m ([Song -isSeekable]): new method to determine whether the
	cursor can be moved within the song.
	([Song -seek:aPos]): new method to change the time cursor.

	* Bundles/OSS/OSS.m ([OSS -timer]): compute time when called.

	* Song.m ([Song +songWithFilename:aFilename]): new method to alloc
	and init a new song at the same time;

2003-12-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): if title string is empty, only put the song's filename between brackets.

	* PlaylistController.m ([PlaylistController -showPlaylistWindow]):
	use [w orderFront] rather than [w orderBack];
	([PlaylistController -addSong:sender]) and
	([PlaylistController -removeSong:sender]): compare to translated
	label titles. 
	([PlaylistController -awakeFromNib]): initalize progressSlider.
	([PlaylistController -switchToSong:aSongplayerIsRunning:running]),
	([PlaylistController -playerPlaying:aNotification]),
	([PlaylistController -playerStopped:aNotification]), 
	([PlaylistController -playerSongEnded:aNotification]): set
	progressSlider's max value to relevant value depending on the case
	(new song or song stopped).
	([PlaylistController -playerUpdateTimer:aNotification]): update
	progressSlider's value.

	* MainController.m ([MainController -openFile:anObject]): new
	method to add a new song to the playlist from the Document->open
	menu.

	* InfoDisplayController.m ([InfoDisplayController -show]): set
	translated image name (Localizable.strings).
	([InfoDisplayController -updateInfoFieldsFromSong:aSong]): really
	set title from deduced value rather than directly from [aSong
	title].

2003-12-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController -addNeededColumns]):
	added a column for song duration time;

	* InfoDisplayController.m ([InfoDisplayController
	-changeTimeDisplay:sender]): activated switching of timer display
	(forward/backward).

	* utils.m: helper functions.
	(timeStringFromSeconds): code previously found in
	InfoDisplayController.

	* Format.h: changed typing for readChannels, readRate. Added
	readDuration method, to return the stream length;

2003-12-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist +_linesFromContent:content]): new
	singleton class to read .pls and .m3u playlist files.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread
	-flushOutputBuffer:dict]): reinit esdDsp from the dict at each
	iteration to avoid writing to a closed filedesc.

	* PlaylistController.m ([PlaylistController
	-togglePlaylist:sender]): display or hide the new playlist window;

	* TableViewController.m ([TableViewController -init]): as a child
	of playlistcontroller, tvc no longer has the playlist outlet and
	now forwards the TableView clicks to its delegate.

	* PlaylistController.h: new outlet: TableViewController, for which
	we act as a delegate.

	* PlaylistController.m ([PlaylistController
	-windowDidMove:aNotification]): implemented window magnetism.

2003-12-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-playerStopped:sender]): release player when stopped, so that we
	can choose another one.

	* Bundles/MP3/MP3.m ([MP
	-readNextChunk:bufferwithSize:bufferSize]): loop when steam.error
	== MAD_ERROR_LOSTSYNC.

	* PlaylistController.m ([PlaylistController
	-playerPaused:sender]): set button state only from delegate.
	functions.

2003-12-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +acceptedFileExtensions]): accepts .mpa,
	.mpga, .mpega files + uppercases.

2003-12-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* OutputPreference.m ([OutputPreference +initializeList]): new
	preference module and handler for selecting the output bundle to
	use.

	* MainController.m ([MainController
	-loadBundlesForPath:aPathwithFileManager:aFileManager]): bundle
	conform to the "Player" protocol are registered with the
	OutputPreference class.

	* InfoDisplayController.m ([InfoDisplayController -show]): only
	use on NSImageView now for active and inactive splash images.
	([InfoDisplayController -changeTimeDisplay:sender]): new stub
	action connected to songTimerField;

	* Bundles/OSS/OSS.m: added OSSPreferences class, copied from
	Esound.

	* Bundles/OSS/GNUmakefile: added OSSPreferences.gorm to the
	RESOURCE_LIST

2003-12-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController
	-loadBundlesForPath:aPathwithFileManager:aFileManager]): scan for
	bundles.

	* PreferencesController.[hm]: new controller for Preferences.gorm.

	* Preference.h: new Preference protocol for classes implementing
	preference sheet handling.

	* NEWS: updated with the new nice features we've added recently.

	* Bundles/Esound/Esound.m: new Esound
	output class, based on OSS. With the same thread model and a
	controller class for its preference panel
	(EsoundPreferences.gorm).

	* Bundles/OSS/OSS.m: old GNUstepPlayer.[hm].
	the OSS class is a childclass of PlayerBase and conforms to the
	Player and Preference protocol.

	* Bundles/Ogg/Ogg.[hm]: old OggStream.[hm]

	* Bundles/MP3/MP3.m ([MP
	-translateBufferToPCM:bufferwithSize:bufferSize]): compute
	the difference between buffer returned by libmad and the player
	buffer, to avoid a buffer overrun.

	* Bundles/MP3/MP3.[hm]: old MP3Stream.[hm]

	* InfoDisplayController.m ([InfoDisplayController
	-updateInfoFieldsFromSong:aSong]): field code simplified by the
	splitting of the album and artist fields.
	([InfoDisplayController -awakeFromNib]): We use boldSystemFont for
	song name and systemFont for the rest.

	* InfoDisplayController.[h,m]: album and artist fields are not
	splitted from each other. We don't use a tabview anymore, just
	overlapped images.

	* GNUmakefile.preamble: link to libmcheck (malloc checks) when
	$(debug) is set to 'yes'. References to format libraries and
	headers moved out.

	* GNUmakefile: added new Bundles to the list of SUBPROJECTS. Added
	Images/eject.tiff to the list of RESOURCE_FILES.

	* FormatTester.m: is now feeded decoder classes (conform to the
	Format protocol) and their extensions by new PreferencesController
	class;

	* Format.h: Format protocol. For decoder modules.

2003-12-08  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -readInfos]): we retain returned NSStrings here
	now rather than in the formats readers.

	* GNUstepPlayer.m: GNUstepPlayer is a child class of PlayerBase
	and responds to "Player" protocol. Common methods moved into
	Player.m.

	* Player.m ([PlayerBase -init]): new. Implementation of PlayerBase
	class.

	* Player.h: definition of "Player" protocol and PlayerBase class.

2003-12-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong]): test if the Song file is
	still accessible, return nil if not so that we don't crash.

	* PlaylistController.m ([PlaylistController
	-TableDoubleAction:sender]): we use switchToSong for coherence.

	* GNUstepPlayer.m ([PlayerThread -threadDidStart:aDict]): use
	NSDebugLog() instead of NSLog().
	([PlayerThread -threadWillExit:aDict]): ditto.
	([PlayerThread -playerThread:dict]): if the thread exits with
	(stream == nil), it means the song ended (even if it didn't even
	start playing).

	* FormatTester.m ([FormatTester +classForFile:filePath]): fixed
	sizeof() to return the correct amount of elements in the format
	list.

2003-12-03  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUstepPlayer.m ([PlayerThread -flushOutputBuffer:dspFd]):
	reenabled this method for clarity.

	* PlaylistController.m ([PlaylistController
	-switchToSong:aSongTVCIs:tvcplayerIsRunning:running]): don't
	stop/restart the player when changing song. Also, we now update
	the display with the new song's informations.
	([PlaylistController -playerSongEnded:sender]): stop playloop if
	no song is left in the list. This let the thread exit and reset
	the GUI.

2003-12-02  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -addSong:sender]):
	play with NSDefaultDirectory to remember last opened directory;

2003-11-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MP3Stream.m ([MP -audioLinearDither:samplewithDither:dither]):
	dithering method copied from madplay.
	([MP -translateBufferToPCM:bufferwithSize:bufferSize]):
	method copied from madplay: audio_pcm_s16le.
	([MP -calcInputRemain]): new method to clarify code.
	([MP -readStreamMetaData]): read first valid frame and deduce
	channels and rate from it.
	([MP -streamInit]): invoke readStreamMetaData.
	([MP -translateBufferToPCM:bufferwithSize:bufferSize]): 'offset'
	renamed to 'start', 'max' to 'limit'.
	([MP -fillPCMBuffer:bufferwithStart:startandLimit:limit]): new
	method extracted from
	-translateBufferToPCM:bufferwithSize:bufferSize to clarify code.

	* MacOSXPlayer.m (inputCallback): ref to OggStream removed.

	* GNUstepPlayer.m ([Player -handleReadProblem:bytesRead]):
	manageOggProblem renamed.

2003-11-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* FormatTester.m ([FormatTester +fileTypeKnown:filePath]): changed
	to a class method.

	* PlaylistController.m ([PlaylistController
	-_addSongsFromOPanel:oPanel]): private method to make addSong
	lighter.
	([PlaylistController -addSong:sender]): accept mp3 as filetype.

2003-01-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController
	-updateInfoFieldsFromSong:aSong]): ditto.

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): enhanced display for incomplete song metadata.

	* InfoDisplayController.m ([InfoDisplayController
	-updateInfoFieldsFromSong:aSong]): do not display a dash whenever
	one of the album name or artist name is missing.

2003-01-02  Wolfgang Sourdeau  <wolfgang@contre.com>

	* main.m: release 0.4

	* MainController.m ([MainController
	-windowWillClose:aNotification]): using a static BOOL, test wether
	the close notification has been called to avoid infinite looping
	and a SIGSEGV (especially on GNUstep).

	* *.[hm]: updated copyright info with year 2003.

	* OggStream.m ([OggStream -readChannels]): new function.
	([OggStream -readRate]): new function.

	* GNUstepPlayer.m ([Player -playIteration:sender]): fill the whole
	buffer first and write it in one shot to avoid too many write()'s.
	([Player -setSong:aSong]): added code to make it able to read one
	channel songs.
	([Player -audioInit]): tune the audio dsp.

2002-12-25  Wolfgang Sourdeau  <wolfgang@contre.com>

	* Initial release.

