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.

