protocol3.h

Go to the documentation of this file.
00001 
00057 #ifndef __NJB__PROTO3__H
00058 #define __NJB__PROTO3__H
00059 
00060 #include "libnjb.h"
00061 
00062 /* Buffer for short reads */
00063 #define NJB3_SHORTREAD_BUFSIZE 1024
00064 
00065 /* Transfer block size (adding and fetching tracks, files */
00066 #define NJB3_CHUNK_SIZE 0x100000U
00067 #define NJB3_FIRMWARE_CHUNK_SIZE 0x40000U
00068 #define NJB3_DEFAULT_GET_FILE_BLOCK_SIZE    0x2000U
00069 #define NJB3_DEFAULT_SEND_FILE_BLOCK_SIZE   0x2000U
00070 
00071 /*
00072  * These are the frame IDs used by the series 3 devices.
00073  * The frames are used for all the commands listed above, so
00074  * the same number series will contain very different things
00075  * like different kind of device properties and parameters 
00076  * (e.g. disk utilization) and metadata tag elements (e.g.
00077  * "artist field"). The only way to see what a frame actually
00078  * represents is to see how it is used.
00079  */
00080 #define NJB3_CODECS_FRAME_ID    0x0001U /* 16 bit array R: List of supported audio file types/codecs */
00081 #define NJB3_DISKUTIL_FRAME_ID  0x0002U /* 14 bytes R: disk utilization information */
00082 #define NJB3_PRODID_FRAME_ID    0x0003U /* 3 bytes FW rev 3 bytes HW rev, string product ID */
00083 /* 
00084  * 0x0004 and 0x0005 return NULL when read as device 
00085  * parameters, are probably used as some kind of 
00086  * metadata frames. 
00087  */
00088 #define NJB3_LOCKED_FRAME_ID    0x0006U /* 16 bit word */
00089 #define NJB3_FNAME_FRAME_ID     0x0007U /* String: Original filename on host */
00090 #define NJB3_UNKNOWN1_FRAME_ID  0x0008U /* 16 bit word, value 0x0004 on NJB Zen USB 2.0, not read by Win SW */
00091 #define NJB3_KEY_FRAME_ID       0x000aU /* 4 bytes string "AR00", "PL00", "SG00", "LG00" known */
00092 #define NJB3_CODEC_FRAME_ID     0x000bU /* 16 bit word */
00093 #define NJB3_POSTID_FRAME_ID    0x000cU /* 16 bit word TrackID on tracks, PlaylistID on playlists */
00094 #define NJB3_DIR_FRAME_ID       0x000dU /* String: Original directory on host */
00095 #define NJB3_FILESIZE_FRAME_ID  0x000eU /* 32 bit word */
00096 /*
00097  * 0x0010 and 0x0011 return a 16-bit value of 0x0002 
00098  * respective 0x0200 when read as device parameters.
00099  * e.g. 0000 0004 0011 0200 0000
00100  * 0x0011 may be sector size or USB xfer block size...
00101  */
00102 #define NJB3_FILECOUNT_FRAME_ID 0x0013U /* 32 bit word R: file & directory count */
00103 #define NJB3_VALUE_FRAME_ID     0x0014U /* 8 bytes, 2*32 bit words */
00104 #define NJB3_JUKEBOXID_FRAME_ID 0x0015U /* 16 bytes R: unique device ID */
00105 #define NJB3_FILETIME_FRAME_ID  0x0016U /* 32 bit word - timestamp (UNIX format) */
00106 #define NJB3_UNKNOWN6_FRAME_ID  0x0017U /* 32 bit word - could be FAT32 attributes */
00107 #define NJB3_FILEFLAGS_FRAME_ID 0x0018U /* 32 bit word set on files and folders - NTFS file attributes */
00108 /*
00109  * 0x0100 is some kind of 6-byte device parameter, value
00110  * from NJB Zen USB 2.0: 0001 0000 03ff
00111  */
00112 #define NJB3_ALBUM_FRAME_ID     0x0101U /* String */
00113 #define NJB3_ARTIST_FRAME_ID    0x0102U /* String */
00114 #define NJB3_GENRE_FRAME_ID     0x0103U /* String */
00115 #define NJB3_TITLE_FRAME_ID     0x0104U /* String */
00116 #define NJB3_LENGTH_FRAME_ID    0x0105U /* String */
00117 #define NJB3_TRACKNO_FRAME_ID   0x0106U /* 16 bit word */
00118 #define NJB3_YEAR_FRAME_ID      0x0107U /* 16 bit word */
00119 /*
00120  * Smartvolume parameters for a track is sent after a track with the command:
00121  * 0x0001 0x0001 update file with info
00122  * 0x0000 0x0000 4 bytes trackid
00123  * 0x01b6 (length)
00124  * 0x010a (smartvol)
00125  * 0x01b6 unknown bytes, appears to be an array of 109 32-bit words.
00126  * 0x0000 terminator
00127  */
00128 #define NJB3_SMARTPAR_FRAME_ID  0x010aU
00129 /*
00130  * 16 bit word R/W: Info about current track playing on the device 
00131  * First byte appear to always be 0x0b, second means the following:
00132  * 0x00 = play/playing
00133  * 0x01 = stop/stopped
00134  * 0x02 = pause/paused
00135  * 0x03 = resume (write only)
00136  */
00137 #define NJB3_PLAYINFO_FRAME_ID  0x010bU
00138 #define NJB3_SEEKTRACK_FRAME_ID 0x010cU /* 32 bit word W: seek to position (in ms) in current track */
00139 #define NJB3_EAX_TYPENAME       0x010eU /* String with the name of an EAX type */
00140 #define NJB3_PLNAME_FRAME_ID    0x010fU /* String: playlist name */
00141 /*
00142  * 8 bytes R/W, BCD-encoded time and date:
00143  * byte: meaning:
00144  * 00: day of the week (0 = sunday)
00145  * 01: day of the month (1-31)
00146  * 02: month of the year (1-12)
00147  * 03: year century digit (20 mostly...)
00148  * 04: year lower part
00149  * 05: hours
00150  * 06: minutes
00151  * 07: seconds
00152  * e.g.: 0619 1120 0518 4351,
00153  * means saturday, 2005-11-19, 18:43:51
00154  */
00155 #define NJB3_TIME_FRAME_ID      0x0110U
00156 #define NJB3_ALBUMCNT_FRAME_ID  0x0111U /* 32 bit word R: number of albums on device */
00157 #define NJB3_TRACKCNT_FRAME_ID  0x0112U /* 32 bit word R: number of tracks on device */
00158 #define NJB3_OWNER_FRAME_ID     0x0113U /* String: owner name */
00159 /*
00160  * 4 bytes: 0x14, one byte charging status then 16 bits of battery level 
00161  * The first byte appear to always contain 0x14.
00162  * The second value is interpreted as follows:
00163  * 0x00 = power connected and charging
00164  * 0x01 = power connected, battery fully charged
00165  * 0x02 = power disconnected
00166  * Then follows the battery level as a 16bit value.
00167  */
00168 #define NJB3_BATTERY_FRAME_ID   0x0114U
00169 #define NJB3_PLCNT_FRAME_ID     0x0115U /* 32 bit word: number of playlists on device */
00170 /*
00171  * 0x0116-0x0118 can be read as device registers.
00172  * they will return one 32 bit word each, this is
00173  * what it looks like on NJB Zen USB 2.0 in rest
00174  * mode:
00175  *
00176  * 0x0116: 00000000
00177  * 0x0117: 00000000
00178  * 0x0118: ffffffff
00179  * 
00180  */
00181 #define NJB3_PLAYTRACK_FRAME_ID 0x0119U /* 32 bit word track ID to play */
00182 /*
00183  * Seen after clearing the playback queue in this sequence:
00184  * 0007 0001 0004 011a 1a00 0000 reading it out gives the 
00185  * same value so probably the writing of it is useless.
00186  */
00187 #define NJB3_UNKNOWN4_FRAME_ID  0x011aU
00188 #define NJB3_PLTRACKS_FRAME_ID  0x011cU /* Array of 16bit words */
00189 /*
00190  * 0x011d - 0x0120 return sensible, static but undeciphered values
00191  * when read out as device registers. Sample values from NJB Zen USB 2.0:
00192  * 0x011d: 00000407
00193  * 0x011e: 00000070
00194  * 0x011f: 1f00 1f01 1f02 1f03
00195  * 0x0120: 0001 fffe 0011
00196  */
00197 #define NJB3_MINMAX_ID          0x0201U /* 2x16 bit values, max and min */
00198 #define NJB3_EAX_ACTIVE_ID      0x0202U /* 16 bit word - this EAX type is active/to 
00199                                          * be activated (0x0000 = off, 0x0001 = on) */
00200 #define NJB3_VOLUME_FRAME_ID    0x0203U /* 16 bit word */
00201 #define NJB3_ENV_FRAME_ID       0x0204U /* 16 bit word - environment setting */
00202 #define NJB3_EQ_FRAME_ID        0x0205U /* 16 bit word - equalizer setting */
00203 #define NJB3_SPAT_FRAME_ID      0x0206U /* 16 bit word - spatialization 2 = full */
00204 #define NJB3_TSCALE_FRAME_ID    0x0207U /* 16 bit word - time scaling factor */
00205 #define NJB3_SMARTVOL_FRAME_ID  0x0208U /* 16 bit word - smart volume setting */
00206 #define NJB3_EAXACTIVE_FRAME_ID 0x020aU /* 16 bit word - 0x0000/0x0001 = activate/deactivate EAX processor */
00207 #define NJB3_EAXID_FRAME_ID     0x020bU /* 16 bit word with the numerical ID of a certain EAX type */
00208 #define NJB3_EAX_INDEX_ID       0x020cU /* 16 bit word - currently selected effect in a set of effects */
00209 #define NJB3_KEYVALUE_FRAME_ID  0x1400U /* Array of value-key-pairs, requested in a 
00210                                           subrequest parameter to this request */
00211 
00212 /* Database IDs, used for eg create_file */
00213 #define NJB3_FILE_DATABASE       0x0000U
00214 #define NJB3__PLAYLIST_DATABASE  0x0001U
00215 #define NJB3_TRACK_DATABASE      0x0002U
00216 
00217 /* Codec IDs */
00218 #define NJB3_CODEC_MP3_ID_OLD        0x0000U /* Used on NJB3/Zen FW? */
00219 #define NJB3_CODEC_WAV_ID            0x0001U
00220 #define NJB3_CODEC_MP3_ID            0x0002U
00221 #define NJB3_CODEC_WMA_ID            0x0003U
00222 /* 
00223  * 0x0004, 0x0005 and 0x0006 unknown, one of them is 
00224  * undoubtedly the Real Networks AAC + Helix DRM 
00225  * decoder. Only very certain firmwares will support
00226  * these I believe...
00227  */
00228 #define NJB3_CODEC_AA_ID             0x0007U /* Audible.com codec */
00229 #define NJB3_CODEC_PROTECTED_WMA_ID  0x0203U /* Is it two bytes actually? */
00230 
00231 /* Stop, pause and resume are very much alike. */
00232 #define NJB3_START_PLAY     0x00
00233 #define NJB3_STOP_PLAY      0x01
00234 #define NJB3_PAUSE_PLAY     0x02
00235 #define NJB3_RESUME_PLAY    0x03
00236 
00237 /* Status codes */
00238 #define NJB3_STATUS_OK                0x0000U
00239 #define NJB3_STATUS_EMPTY             0x0001U /* You tried to retrieve an empty item */
00240 #define NJB3_STATUS_TRANSFER_ERROR    0x0002U /* Error during read or write */
00241 #define NJB3_STATUS_BAD_FILESIZE      0x0003U /* Illegal file size (e.g. negative, too large) */
00242 #define NJB3_STATUS_NOTIMPLEMENTED    0x0004U /* For example if EAX is not supported on a device */
00243 #define NJB3_STATUS_NOTEXIST          0x0005U /* Tried to access nonexistant track */
00244 #define NJB3_STATUS_PROTECTED         0x000cU /* Tried to access protected object */
00245 #define NJB3_STATUS_EMPTY_CHUNK       0x000eU /* Appear when requesting empty metadata lists
00246                                                * or beyond the end of files. */
00247 
00248 /*
00249  * Status codes that must exist, find by trial-and-error:
00250  * - postid invalid (does not exist)
00251  * - disk full
00252  * - file path / track name etc too long 
00253  * - playing (cannot transfer when playing)
00254  * - tried to skip to position outside file in playback mode
00255  * - too many files/tracks etc - limit reached.
00256  * - filename or track+artist+(all metadata) is the same as
00257  *   one already present on the player
00258  * - transfer in progress (a track/file is transferring in
00259  *   either direction
00260  */
00261 
00262 #define njb3_start_play(njb) njb3_ctrl_playing(njb, NJB3_START_PLAY)
00263 #define njb3_stop_play(njb) njb3_ctrl_playing(njb, NJB3_STOP_PLAY)
00264 #define njb3_pause_play(njb) njb3_ctrl_playing(njb, NJB3_PAUSE_PLAY)
00265 #define njb3_resume_play(njb) njb3_ctrl_playing(njb, NJB3_RESUME_PLAY)
00266 
00267 /* Structure to hold protocol3 states */
00268 typedef struct {
00269   /* Get extended tags */
00270   int get_extended_tag_info;
00271   njb_songid_t *first_songid;
00272   njb_songid_t *next_songid;
00273   njb_playlist_t *first_plid;
00274   njb_playlist_t *next_plid;
00275   njb_datafile_t *first_dfid;
00276   njb_datafile_t *next_dfid;
00277   int current_playing_track;
00278   njb_keyval_t *first_key;
00279   njb_keyval_t *next_key;
00280   njb_eax_t *first_eax;
00281   njb_eax_t *next_eax;
00283   u_int8_t eax_processor_active;
00285   char *product_name;
00287   u_int8_t fwMajor;
00289   u_int8_t fwMinor;
00291   u_int8_t fwRel;
00293   u_int8_t hwMajor;
00295   u_int8_t hwMinor;
00297   u_int8_t hwRel;
00299   u_int16_t last_elapsed;
00301   u_int8_t turbo_mode;
00302 } njb3_state_t;
00303 
00304 
00305 /* 
00306  * NJB3 functions: the commands listed at the top of this
00307  * file are wrapped in binary form more or less using the defined
00308  * values in this file to conjure and decipher byte-sequences
00309  * sent by the devices.
00310  */
00311 int njb3_init_state (njb_t *njb);
00312 int njb3_set_bitmap(njb_t *njb, u_int16_t x_size, u_int16_t y_size, const unsigned char *bitmap);
00313 int njb3_current_track (njb_t *njb, u_int16_t * track);
00314 int njb3_elapsed_time (njb_t *njb, u_int16_t * elapsed, int * change);
00315 int njb3_play_track (njb_t *njb, u_int32_t trackid);
00316 int njb3_queue_track (njb_t *njb, u_int32_t trackid);
00317 int njb3_clear_play_queue(njb_t *njb);
00318 int njb3_ctrl_playing (njb_t *njb, int cmd);
00319 int njb3_seek_track (njb_t *njb, u_int32_t position);
00320 int njb3_get_codecs(njb_t *njb);
00321 int njb3_ping (njb_t *njb, int type);
00322 int njb3_power_status (njb_t *njb, int *battery_level, int *charging, int *ac_power);
00323 int njb3_readid (njb_t *njb, u_int8_t *sdmiid);
00324 int njb3_capture (njb_t *njb);
00325 int njb3_release (njb_t *njb);
00326 int njb3_get_disk_usage (njb_t *njb, u_int64_t *totalbytes, u_int64_t *freebytes);
00327 int njb3_turnoff_flashing(njb_t *njb);
00328 int njb3_get_owner_string (njb_t *njb, char *name);
00329 int njb3_set_owner_string (njb_t *njb, const char *name);
00330 njb_time_t *njb3_get_time(njb_t *njb);
00331 int njb3_set_time(njb_t *njb, njb_time_t *time);
00332 int njb3_reset_get_track_tag (njb_t *njb);
00333 njb_songid_t *njb3_get_next_track_tag (njb_t *njb);
00334 int njb3_reset_get_playlist_tag (njb_t *njb);
00335 njb_playlist_t *njb3_get_next_playlist_tag (njb_t *njb);
00336 int njb3_reset_get_datafile_tag (njb_t *njb);
00337 njb_datafile_t *njb3_get_next_datafile_tag (njb_t *njb);
00338 int njb3_read_keys(njb_t *njb);
00339 njb_keyval_t *njb3_get_keys(njb_t *njb);
00340 int njb3_request_file_chunk(njb_t *njb, u_int32_t fileid, u_int32_t offset);
00341 int njb3_get_file_block(njb_t *njb, unsigned char *data, u_int32_t maxsize);
00342 u_int32_t njb3_create_file(njb_t *njb, unsigned char *ptag, u_int32_t tagsize, u_int16_t database);
00343 u_int32_t njb3_send_file_chunk(njb_t *njb, unsigned char *chunk, u_int32_t chunksize, u_int32_t fileid);
00344 int njb3_send_file_complete(njb_t *njb, u_int32_t fileid);
00345 int njb3_create_folder(njb_t *njb, const char *name, u_int32_t *folderid);
00346 int njb3_delete_item(njb_t *njb, u_int32_t itemid);
00347 int njb3_update_16bit_frame(njb_t *njb, u_int32_t itemid, u_int16_t frameid, u_int16_t value);
00348 int njb3_update_string_frame(njb_t *njb, u_int32_t itemid, u_int16_t frameid, unsigned char *str);
00349 int njb3_update_tag(njb_t *njb, u_int32_t trackid, unsigned char *ptag, u_int32_t ptagsize);
00350 int njb3_create_playlist(njb_t *njb, char *name, u_int32_t *plid);
00351 int njb3_add_multiple_tracks_to_playlist (njb_t *njb, u_int32_t *plid, u_int32_t *trids, u_int16_t ntracks);
00352 int njb3_adjust_volume(njb_t *njb, u_int16_t value);
00353 int njb3_control_eax_processor (njb_t * njb, u_int16_t state);
00354 int njb3_adjust_eax(njb_t *njb, u_int16_t eaxid, u_int16_t patchindex, u_int16_t active, u_int16_t scalevalue);
00355 void njb3_read_eaxtypes(njb_t *njb);
00356 njb_eax_t *njb3_get_nexteax(njb_t *njb);
00357 int njb3_announce_firmware(njb_t *njb, u_int32_t size);
00358 u_int32_t njb3_send_firmware_chunk(njb_t *njb, u_int32_t chunksize, unsigned char *chunk);
00359 int njb3_get_firmware_confirmation(njb_t *njb);
00360 void njb3_destroy_state(njb_t *njb);
00361 
00362 #endif

Generated on Mon Sep 11 00:52:12 2006 for libnjb by  doxygen 1.4.7