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.

