Author: abock
Date: 2005-09-07 21:38:58 -0400 (Wed, 07 Sep 2005)
New Revision: 49675

Added:
   trunk/ipod-sharp/src/ShuffleSongDatabase.cs
Log:
iPod shuffle support! woo

Added: trunk/ipod-sharp/src/ShuffleSongDatabase.cs
===================================================================
--- trunk/ipod-sharp/src/ShuffleSongDatabase.cs 2005-09-08 01:38:33 UTC (rev 
49674)
+++ trunk/ipod-sharp/src/ShuffleSongDatabase.cs 2005-09-08 01:38:58 UTC (rev 
49675)
@@ -0,0 +1,117 @@
+using System;
+using System.IO;
+using System.Text;
+
+namespace IPod {
+    
+    public class ShuffleSongDatabase  {
+        
+        public static bool Save(Device device) {
+            
+            if(device.Model != DeviceModel.Shuffle)
+                return false;
+        
+            string sdbFile = device.ControlPath + "/iTunes/iTunesSD";
+        
+            using(BinaryWriter writer = new BinaryWriter(new FileStream(
+                sdbFile, FileMode.Create))) {
+                
+                WriteHeader(writer, device.SongDatabase.Songs.Length);
+                
+                foreach(Song song in device.SongDatabase.Songs) {
+                    WriteSongEntry(writer, device, song);
+                }
+            }
+            
+            return true;
+        }
+        
+        private static void WriteHeader(BinaryWriter writer, int songCount) {
+        
+            // number of song entries in the file
+            writer.Write((byte)0x00);
+            writer.Write(Utility.ReverseByteOrder((short)songCount));
+            
+            // unknown (0x010600)
+            writer.Write((byte)0x01);
+            writer.Write((byte)0x06);
+            writer.Write((byte)0x00);
+            
+            // size of header (0x000012, 18 byte header)
+            writer.Write((byte)0x00);
+            writer.Write((byte)0x00);
+            writer.Write((byte)0x12);
+            
+            // 9 bytes of 0 padding?
+            writer.Write(new byte [9]);
+        }
+    
+        private static void WriteSongEntry(BinaryWriter writer, Device device, 
+            Song song) {
+        
+            // size of entry 
+            writer.Write((byte)0x00);
+            writer.Write(Utility.ReverseByteOrder((short)0x022e));
+            
+            // unknown (0x5aa501)
+            writer.Write((byte)0x5a);
+            writer.Write((byte)0xa5);
+            writer.Write((byte)0x01);
+            
+            // start time in 256ms increments (60 seconds = 0xea)
+            writer.Write(new byte [3]);
+            // unknown (always 0?)
+            writer.Write(new byte [3]);
+            // unknown, assoc. with start time
+            writer.Write(new byte [3]);
+    
+            // stop time in 256ms increments (60 seconds = 0xea)
+            writer.Write(new byte [3]);
+            // unknown (always 0?)
+            writer.Write(new byte [3]);
+            // unknown, assoc. with stop time
+            writer.Write(new byte [3]);
+            
+            // volume (-100 to 0 to 100)
+            writer.Write((byte)0x00);
+            writer.Write(Utility.ReverseByteOrder((short)0x0064));
+            
+            // file type (0x01 = MP3, 0x02 = AAC, 0x04 = WAV)
+            writer.Write(new byte [2]);
+            switch(song.Track.Type) {
+                case TrackRecordType.MP3:
+                    writer.Write((byte)0x01);
+                    break;
+                case TrackRecordType.AAC:
+                default:
+                    writer.Write((byte)0x02);
+                    break;
+            }
+                    
+            // unknown (0x000200)
+            writer.Write((byte)0x00);
+            writer.Write((byte)0x02);
+            writer.Write((byte)0x00);
+            
+            // file name (UTF-16, record is 522 bytes)
+            string file = song.Filename;
+            if(file.StartsWith(device.MountPoint)) {
+                file = file.Substring(device.MountPoint.Length);
+            }
+            
+            byte [] filebytes = Encoding.Unicode.GetBytes(file);
+            writer.Write(filebytes);
+            writer.Write(new byte [522 - filebytes.Length]);
+            
+            // shuffle flag (0x00 to disable playback in shuffle mode)
+            writer.Write((byte)0x01);
+            
+            // bookmark flag (0x00 to disable)
+            writer.Write((byte)0x00);
+            
+            // unknown, always 0?
+            writer.Write((byte)0x00);
+        }
+    }
+}
+

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to