My Virtual CD Changer Project, V2

This is a computer-based music player, for my car, that will replace the one that I built back in 2001. I started the original car-computer project, back in 2001, for three reasons:

Instead of using a stand-alone MP3 player, I like to use a computer. This allows me to get around the storage limitations of stand-alone music players and gives me the ability to pick the features I want.

Computer technology has come a long way since 2001. At the time, 80GB hard drives cost $300. Laptop drives topped out at 30GB and cost even more money. Mini-ITX motherboards weren't available yet, and embedded/industrial motherboards were extemely expensive. Because of these limitations certain compromises had to be made. While a number of trade-offs will always exist, newer technology has a way of making the process a little bit easier.

Table of Contents


Choosing an Operating System:

The most common options are Windows, Linux, and DOS. Time to boot, and stability are extremely important issues when trying to meet my requirements. For me, DOS is still the obvious choice, as long as good software remains available. (During the planning stages for this project, in mid 2009, MPXPlay was still being actively developed. The developer still supports the program in 2018.)

DOS is fast and simple, keeping the hardware requirements low. It boots quickly, doesn't need to be shut down properly, and there's no registry. That having been said, it's not for everyone. If I wanted/needed my computer to do a number of things simultaneously (playing DVDs, GPS, etc) then I would've had to pick something else.


Back in 2001, I picked MPXPlay. MPXPlay plays sound files in a number of formats (WAV, MP3, FLAC, APE, Vorbis, AC3, AAC, MPC, WMA, Wavepack), and is compatible with a number of soundcards that normally aren't supported in DOS. It supports disc/title/track naming. It can load its list of songs from a playlist, or it can be pointed to a particular directory. I do the latter, and use my front-end software to handle the directory navigation.


Options include keyboards, keypads, remotes, and gamepads. A full-size keyboard would be too big. Keypads are still a bit cumbersome. While infrared remotes are a good option for many people, I'd probably end up losing the thing. I like gamepads because they are small and easy to use.

Since my controller of choice, the Gravis Gamepad Pro, has been discontinued, I'll be using a Logitech Precision Gamepad 2. It has a layout that's almost identical to the Gamepad Pro, but it uses a USB interface.

Getting a USB gamepad to work, while running DOS, was a major road-block that held up this project for quite some time. The problem is, DOS has no USB stack. I tried three different hardware-based USB stacks and a two different TSR programs, with varying degrees of success. Finally in the summer of 2018 I found a hardware-based USB host that works in a consistant manor.


Since a computer monitor is too big to use in a car, most people use TFT graphical LCD's or LCD character displays. Due to cost and space requirements, I chose to go with a character display. There are two types of character displays: parallel and serial. Parallel LCDs are less expensive, but require soldering and use thicker cabling. While serial LCDs are more expensive, they come pre-assembled, require less conductors in their cabling, and work better over longer distances.

In the last project, I chose the Matrix Orbital 2041 serial character display. Since it does what it's supposed to, and hasn't given me any trouble, I'll continue using it.

The computer:

Last time, I used a proprietary motherboard out of an old PC, then customized a metal case to fit it. This time, I used as much off-the-self hardware as possible. I started with a Mini-ITX case and motherboard then went from there.

Getting Started

Getting my USB gamepad working under DOS was a project in and of itself. I have a whole page dedicated to it here.

Choosing a computer case:

I was looking for a case that was small and compact, but large enough to accept a PCI card. One case that immediately caught my attention was the Voom PC case. I liked everything about it except for the fact that it's too small to allow you to use a PCI card. I went over to the forums and searched around, looking for other ideas. I noticed that a couple of people were using a similar case, made by Mobile Computing Solutions. Their case is about 1/2" taller than the Voom case, allowing just enough room for a PCI card.

Choosing a motherboard:

Since I'm not playing video, I don't need a fast CPU. Instead, I wanted a motherboard and processor that are energy efficient. This makes it easier to keep the system cool, and allows me avoid using a super-expensive power supply. DC-DC power supplies are expensive enough, already. I picked the Jetway NF76-N1GL-LF motherboard. It uses the 1.0 GHz fanless version of the Via Nano processor. I liked the fact that it doesn't need a CPU fan. It's one less thing to go wrong. The processor doesn't draw much power. The motherboard has 4 serial ports (that ought to be enough). It has two SATA ports (I need at least one). Last, but not least, it has onboard video and networking. This allows me to use a sound card in the PCI slot.


For a car-computer, solid-state storage is ideal because there's no moving parts and it isn't temperature-sensitive. The only problem is the cost. Back in 2009, large solid-state drives were extremely expensive. The next best thing is a laptop hard drive. They take up less room than a desktop drive and draw less power. Even in 2009, laptop drives were dirt cheap. As a compromise, I used a 4 gigabyte Transcend IDE Flash Module as the boot drive, and a 250 GB Hitachi 5K500.B laptop hard drive for the music.

Sound Card:

I picked the DIAMOND XtremeSound XS71. It's cheap, and it's based on the MPXPlay-compatible CMI8768 sound chip.

Power Supply:

After the basic components had arrived, I hooked up a standard desktop power supply, hacked up some extension cables, and measured the amount of power draw on the 3.3v, 5v, and 12v rails. Without that information, it's impossible to know how big of a power supply you need. The system draws 0.33-0.35a from the 3.3v line, 0.55a from the 12v line, and 1.23-1.75a from the 5v line. This meant that I could use a low-wattage power supply and still have plenty of room to spare. The Mo-Co-So case was designed to use the Minibox M2-ATX power supply, but after reading mixed reviews I decided to look elsewhere. The Opus 150w power supply gets a lot of good reviews, but it's 7" long, which would make it difficult to fit in the Mo-Co-So case. Finally I took a look at some of the industrial power supplies and found one that I liked: the Magic Power MPD-807H. It's a 70w DC-DC ATX power supply with a wide input range (9-32v). The primary and secondary sections are isolated, which should make it less noisy as well as avoiding potential ground-loop issues. Last but not least, it looks like it's built to last. After taking some measurements I determined that while there isn't much room to spare, it will fit in my case. It doesn't have a shutdown controller, so I needed to hook it up to a relay. I also needed to make my own mounting plate for it.


Mounting the power supply:

[Case, Power supply, aluminum sheet] Since the case was designed for a different power supply, than the one I'm using, I had to come up with my own mounting system. I started with a 0.064 x 4 x 10" sheet of aluminum, then cut it down to 6 1/4 x 3 1/8". This provides an extra 3/8" on each side and covers the entire width of the power supply.

[Drilling new holes] Next, I drilled four new holes in the bottom of the case. These were used for mounting the new stand-offs. In order to match the case as closely as possible, I used a countersink bit that was designed for flathead M3 metric screws. Next I attached four M3 x 20mm female stand-offs to the case, using M3 x 8mm flathead screws. Then I drilled four holes in the plate, to match the mounting holes on the bottom of the power supply.

[Standoffs] [Standoffs] [Power Supply Mounted]

Next I attached the power supply to the aluminum plate, using standard #6-32 x 4mm hard drive screws. These are like a shorter version of the case screws that are commonly used on desktop computer cases. Finally, I attached the plate to the stand-offs.


[Fans] [New fan mounted in case] The case came with a "Colorful" 50mm x 10mm fan. I would've used it if it hadn't been so noisy. It sounded like the bearings were bad. The fix was easy. I ordered a different fan, then swapped the wires over to the new one.

Power connector upgrade:

[Stock power connector cutout] [Tracing the powerpole connector] The case came with a 6-pin molex power connector. It was a real pain to connect and disconnect. That's with everything out in the open. I'm sure it would be an even bigger headache when the computer is mounted in the trunk of the car. After looking for something that would be a bit easier to work with, I decided to use Anderson Powerpole connectors.

[Make cutout taller] [Get rid of notch] I used a file to increase the height of the cutout opening. Then I filed the right side to the cutout, to get rid of the notch.

[Left side of cutout made taller] [Cutout mods complete] [Picture of cutout and powerpole connector] Next I increased the height of the left side of the cutout, to make it tall enough so that I could insert the connector. Then I used the file on the right side of the cutout to make the right side wide enough for the connector. I left little pins. They prevent the red section, of the connector, from sliding past the others.

DC output connector mod:

The case comes with a DC output connector, for supplying power to a LCD display. It comes wired for 12v. My LCD character display requires 5v. The fix was fairly simple. I removed the pins from the connector. Then I put some red heatshrink on the positive lead. Finally I inserted the pins in the 5v side of the molex connector. [Power output connector, stock configuration] [Pins removed from the molex drive connector] [Modified power output connector]

Boot Switch:

[] [] When I start up the computer, it can either be: playing music through the analog output of the sound card, playing music from the s/pdif output of the sound card, loading DOS network drivers so I can perform basic maintenance, or booting from a BartPE image so I can perform heavy-duty maintenance. A standard serial port has four input status lines. These status lines can be hooked up to a switch, to form a very simple input device. Here is a link to a page that explains how to do this.

To handle all four possible choices, I cut the cable off a serial bracket then wired it to a rotary switch. On the switch, I connected nothing to position 1, CD/DSR/CTS to positions 2/3/4, and DTR to common. On startup a program will run, checking the input status lines on the serial port (COM4). Then the program will return an errorlevel based what it read from the serial port. From there, one can check the errorlevel number, and go to the appropriate section of the batch file.

Misc Mods:

[Extra holes drilled into back plate] Since I'm not using the RCA connectors that came with the case, I removed them. Then I drilled a few extra holes: one for the rotary switch, one for a power switch, and another for a remote reset switch.

[Finished modding the back plate] I mounted the rotary switch on the far left. Next, I put grommets in the holes, where the RCA connectors used to be, and ran serial cables for COM2 and COM3. On the right-top I mounted a power switch. Finally, on the bottom right, I ran a wire that will be hooked to a remote reset switch.


[Side of the case] [Other side of the case] [Computer fully assembled] With all of the case mods complete, it came time to wire everything together. The output of the power switch (yellow wire) was wired to the coil, on the relay (green wire). The power switch is an on-off-on switch. I wired it so the power can be always-off, always-on, or switched. "Always-off" happens when the switch is in the off position. "Always-on" happens when the switch takes the power-in from the, red power connector, and sends it to the relay coil. "Switched" happens when the switch connects the blue power connector to the relay coil.

A ground wire was ran to the power supply, and to the other side of the relay coil (blue wire). A power wire was run to the relay (red wire), and to the "always-on" position of the switch. Then, out from the relay (yellow wire), I connected power to the power supply.

Beyond that, it was mainly a matter of plugging in connectors. I was able to fit everything in the case, but as you can see, it was a tight fit.



The wiring is mostly unchanged from what I had in place for the original car-computer. I already had serial and audio cables ran to the trunk. The old system used power, ground and a switching wire that triggers a relay. The new system is powered the same way. The only thing that needed to be done was to re-route the wires, then attach an Anderson Powerpole connector to the power wires. The picture below shows the old car-computer on the far right.

[Old Car Computer]


Because of its smaller size, I was able to mount the new car-computer above the speakers. I already had a spacer board. I fabricated a computer mount by adding onto it, then attaching it to the car using large thumbscrews.

[New Car Computer]


VCC - Virtual CD Changer for DOS

VCC is the custom frontend software that I wrote specifically for my car computer. It consists of two parts:
-- a front-end program which handles the directory navigation
-- a tsr program which remains active while MPXPlay is running

The music is organized in a two-level directory structure. From the music directory I use a directory for each letter of the alphabet. Inside the directories is subdirectory for each album:

                 /          \
                A    ...     Z
               /              \
          ACDC1      ...       ZZTOP3
         /     \              /      \
       01.wav...10.wav    01.mp3...10.mp3

The music directory can be in any place, but requires this structure for the software to function properly. The navigation is entirely directory-based. This eliminates the need for playlists and the hassle of maintaining them. This system works like a 26-cartridge CD-changer would, assuming the CDs are grouped alphabetically. Short filenames are used for both the music directories and the sound files.

Track and disc info are stored in two text files: fileinfo.txt and discinfo.txt. Discinfo.txt is used for disc naming. Fileinfo.txt is optional. If the file is present is will be used for track naming. If it's missing, track naming won't work unless the music files are tagged.

An example fileinfo.txt is as follows:
01.FLA AC/DC:Jailbreak
02.FLA AC/DC:You Ain't Got a Hold on Me
03.FLA AC/DC:Show Business
04.FLA AC/DC:Soul Stripper
05.FLA AC/DC:Baby Please Don't Go

While putting the band name on each line is a bit redundant, MPXPlay doesn't see it as a valid list-file without it.

Likewise, discinfo.txt looks like this:
'74 Jailbreak

The advantage to using text files is that no special utilities are needed to update any of disc / track information. Your favorite text editor will do the job.

Hardware Requirements:
Logitech Precision Gamepad (or similar) connected to a Hobbyronics USB host controller board, as described on the DOS USB Gamepad page
Matrix Orbital 2041 (or similar) serial LCD display
Pentium Class PC (a Pentium 75 or better)

Software Requirements:
DOS (tested on MSDOS 7.1 and FreeDOS 1.2)
MPXPlay 1.62 (will probably work on MPXPlay 1.57 and later)


To make VCC startup automatically every time the machine is booted, add the following lines to the autoexec.bat:
cd c:\playerdir
c:\playerdir\frontend.bat c:\musicdir

Replace playerdir and musicdir with the names of the directories that you made for the player and the music.


[Logitech Precision Gamepad]

The following info is displayed, by default, on the 20X4 LCD:

[20X4 LCD in action]  Line1: Band Name
 Line2 : Album Title
 Line3: Track #  /  Track Title
 Line4: Time / Spectrum Analyzer / Bitrate or compression percentage

Testing in VMware Workstation 12 Player:

DOS, MPXPlay, and VCC can be run inside of a virtual machine. The LCD and gamepad can also be emulated in software. The process for getting this to run on a 64-bit version of Windows (without using any special hardware) is as follows:

[Screenshot of VCC, LcdEm, and GPSim]

If you plan to experiment with this for any length of time, you'll want to supply your own music. To avoid potential legal hassles, I trimmed all of the audio files down to 30 seconds in length. You can transfer files by enabling the "Shared Folders" feature in VMware, and using the "VMFTP" utility, included in the "C:\VMWARE" directory. See "VMFTP.TXT" or this link for instructions.

Last Update: 10-02-2018