MP3 Player or Noise Maker: Part 1
Brandon Beck: gte196n
Before even starting this assignment, I spent 2 or 3 hours deciding on what methods I would need to make this program short and easy.
I first thought about what attributes I would need in SoundFileGroup. The first two obvious things were the directory to search in, and the matches that were found in that directory. After using the Squeak book as a resource, I decided that I would need to have separate code to get each on the file extensions to play; one for each of them. Initially I decided to throw them into the SoundFileGroup as methods, but then at a second glance I decided to have the code to play the files in a different class because it would allow for better abstraction and easier access to code. That way, if I later wanted to support a different sound file type, it would be easy to change. Also, if I were to write another class that wanted to be able to play music (for example an alarm clock that plays a song when it reaches "zero").
Now I had two classes. I started with the most specific stuff. Since I had already determined that I would need a different method to play each one of the file extensions: aiff, mp3, midi, and wav, I would need 4 methods in my Players class (the class used to play music files). Thus I had a class Players with four methods in it: playAIFF, playMP3, playMIDI, and playWAV. I didn't start coding yet; I still wanted to get the rest of my design down, so I went onto designing SoundFileGroup.
With SoundFIleGroup, I had already determined that I would need a dirName, and a set of matches found given the search criteria. After more thought, I determined that I would need another variable to hold the songs playing (player). By just looking at the requirements, I knew that I would need at least five methods in this class: playAndWait, startPlaying, stopPlaying, fileArray, and printString. As I thought about printString, I started looking at other classes in squeak because everything has a printString. As I browsed around the squeak browser, I noticed that printString called printOn, and printOn was coded for each class. After seeing this, I decided that I would not need to code printString, but rather a printOn method.
Since I wanted to print both that it was a soundfilegroup, and the matches that were found, printOn would have two purposes. Therefore, I decided to break each printing job up and make two new methods: printElementsOn: using: and printNameOn. printNameOn printed out that it was a SoundFileGroup while printElementsOn: using: printed out the songs that were matched. Now I turned to fileArray. I figured fileArray was already simple enough and would not need to call another method. playAndWait is where I would need to make use of the Players class and my player instance variable. For this, I can just traverse my matches, and check for the appropriate extension and call the correct play mehtod in my Players class. I want to code the play methods to play the entire song, so I should not have to check anything here. For the startPlaying, I think I should just be able to make a new process with Background priority and call my playAndWait method. And for stopPlaying, just stop the process. This means I need another instance variable (process).
After I finished with this, I thought about how I was going to code match: from: I spent most of this time searching the squeak browser. I found fullNamesOfAllFilesInSubtree and includesSubString. So, think I can get all the file names of a subtree and do a do loop on my collection of search specs while doing another do loop within that one on the file names. Then I can call includes SubString. In the design part, the match: from: method took the longest to decide what to do. One reason for this is because it will probably be the largest (in length of code) and I spent most of the time searching and getting familiar with FileDirectory and String.
After that....I took a good two day break and started the coding!!! With this desing, which I thought was good and well thought out; I figured I could use this design for the remainder of the assignments without much change. Also it only took about 2 hours of actual coding to get it to work! Which is why it is important to design first and code second!!!