cdplayer.ini
questions and answers

common questions, common answers   :-)

Are there any limits to cdplayer.ini?
Oh yes, there are. The current WIN95 version can only handle *.ini files up to 64 KByte. In some circumstances, cdplayer.ini files beeing greater were accidentually cut to 64 K. Microsoft released an update file dated 11-Apr-96. It is said, that this update solves some winsock problems. Besides this I think, the 64 K cut-off there no longer occurs. If you have a cdplayer.ini file > 64 K and you insert a cd whose information is above this limit, you get a 'new artist' display instead of the stored information.
Delphi programmers may like to take a look at my delphi corner with BigIni Unit which handles *.ini files greater than 64 K.
What is BigCdplayer.ini?
This is the ini-file which can hold masses of entries for the CD player maximus.
How do I import tracklists from other programs to cdplayer.ini?
Please check out PLC, my Play List Converter. It supports several file formats.
Other import tools known?
CDMerge is another freeware tool and can be found at members.tripod.com/~CdMerge/.
What happens to these files if they contain 2 of the same entry?
Generally, the second entry is ignored. If you want to merge two or more *.ini files, you should paste the better ones (yours of course) first.
In my cdplayer.ini project, I try to merge the entries manually using the best data for each cd. Afterwards, they are split again into files for several countries. You'll have to merge them into your own file.
Does the file get sorted out by cdplayer.exe when it is first loaded after a merge?
No. As far as I found out, the Win95 kernel routines ignore the duplicate sections in *.ini files when reading, but don't erase them when writing the *.ini file.
Note: in cdplayer.ini, the section is the cd-identifier e.g. [137EBFA].
Are all tags in the ini-file necessary?
Obviously not. I removed the
EntryType=
order=
numplay=
tags from my files. First, I've never seen an Entrytype other than "1" (whatever it is). Second, if you play your cds in standard order, then the order and numplay tags contain redundant data. All player programs I know run without this three tags, too.
However, if you have your playlist reordered, the remove of the Entrytype-line causes a lost of your playlist. In my Guest House there's a simple program to erase unnecessary lines.
Know anything about Deluxe CD Player?
More and more. :-)
Please visit my threeTIX page and the articles section there.
Is there any additional information?
If you did not get your infos yet, it's hard to find them. MS had released a short article How to Move CD player Settings from One Computer to Another but there is not much we did not find out ourselves...

The following answers are for programmers mostly

As you must know, the cdplayer identifies each CD by generating a header for each cd.
My question is: how are those headers (index) generated? Is it coded onto each CD, or is it generated by cd-player?
Obviously there is no unique id on every cd medium (think of the ISBN number for printed books which are unique, or see ISRC-discussion below). Thus the id is soft-generated. In case of Microsoft-based systems, the system does the work for you (I think MSCDEX does). How? The section checksum techniques of this document shows a solution approach based on the track start positions.

This soft-generated id is also known as the "volume serial number": use the DIR command to see what I mean.

Note that sometimes it even happens that two differend cds generate the same id. On the other way we know that there are some releases of pop-cds which have different ids in different countries (eg. US vs. Europe).
Programmers can get the id using the call
BOOL GetVolumeInformation(
  LPCTSTR  lpRootPathName,              // address of root directory of the file system
  LPTSTR   lpVolumeNameBuffer,          // address of name of the volume
  DWORD    nVolumeNameSize,             // length of lpVolumeNameBuffer
  LPDWORD  lpVolumeSerialNumber,        // address of volume serial number
  LPDWORD  lpMaximumComponentLength,    // address of system's maximum filename length
  LPDWORD  lpFileSystemFlags,           // address of file system flags
  LPTSTR   lpFileSystemNameBuffer,      // address of name of file system
  DWORD    nFileSystemNameSize          // length of lpFileSystemNameBuffer
 );
which you can find in the help files of your C(++) or Delphi compiler. Convert the field lpVolumeSerialNumber to an hex string - so you get the result which can be found in cdplayer.ini. Note: this method fails on cds with less than two or three tracks.
You can use the mciSendCommand function with parameter mci_Info and flag MCI_INFO_MEDIA_IDENTITY. Convert the result string to an integer and then to a hex string. See Delphi example for details.
Visual Basic users might prefer the code example found in the article Recognizing an Audio CD
(external document - originally released by 'VB Online Magazine', issue 12/96).
I found out another trick to get the serial number. Within Windows 95, a pseudo file is assigned to each audio track. These files are named Track01.cda, Track02.cda and so forth. You can access them with commands like dir and copy. Within your self-written programm you can "open" and read the file. Look at this sample dump of Track01.cda with some VB code.

checksum techniques

Here we have the first example, written in Delphi wich accumulates all TrackPosition values in a specific way to get the ID used in cdplayer.ini.
Another example is now available for Visual Basic.

more checksums

I found some (neary identical) articles from MS knowledge base, called How to Get or Create a Unique Audio CD Volume Label and VB 3: How to Get or Create a Unique Audio CD Volume Label.
Steve Stasiw wrote me that these IDs are not identical to cdplayer.ini's.
If you are a UNIX-user, take a look at the cddb / xmcd-project. Note that they use a different way of creating a 'unique' id: they are different to cdplayer's. Look at the extracted sample code here.
How can I use MCI_INFO_MEDIA_UPC to get the UPC?
To get the universal product code (UPC) use mciSendCommand function with parameter mci_Info and flag MCI_INFO_MEDIA_UPC.
Again here one Delphi example.
Remember, nearly every product you can buy has a Universal Product Code (UPC). You find the UPC printed as barcode on your goods.

Actually, a test series resulted in different values returned on each call to mciSendCommand. Whilst one drive gave some results, another drive on the same pc didn't. Besides this, the MCI documentations tell us that the UPC is not on every cd. Did we find a lottery routine?

What is ISRC?
The International Standard Recording Code is a code to give a unique id to audio tracks. This serial number consists of twelve bytes and is structrured as follows:
  • 2 bytes (alpha) country
  • 3 bytes (alpha) author (= owner code)
  • 2 bytes (num) year
  • 5 bytes (num) song code
How can I use IOCTL_CDROM_READ_Q_CHANNEL to get the ISRC?
Does anyone have an idea? I found some fragment documentation in MS Win NT DDK but I have no idea how to use it.
The story is:
According to the red book standard for CD-DA (compact disc digital audio) the Q channel may contain a "disk unique catalogue number" or a "music-track unique catalogue number". The SubCode channel Q is (among others) part of the cd organisation, not of the user data itself.
As far as I know, not every manufacturer uses these unique ids. Nevertheless we'd like to know how to access to them.
Is there any correlation between MEDIA_IDENTITY, UPC and ISRC?
Can one be calculated from another?
Please mail me if you know more.
For additional information
[comp.publish.cdrom] CD-Recordable FAQ
compact disc digital audio

[home] [cdplayer.ini page]

Edy Hinzen 1996 - 2003 edy[-at-]hinzen.de