libnjb 2.2.7
Macros | Functions | Variables
protocol.c File Reference
#include "config.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include "libnjb.h"
#include "protocol.h"
#include "byteorder.h"
#include "njb_error.h"
#include "usb_io.h"
#include "ioutil.h"
#include "defs.h"
#include "base.h"
#include "eax.h"
#include "songid.h"
#include "datafile.h"
#include "njbtime.h"
#include "playlist.h"

Macros

#define NJB_STATUS(a, b)
 

Functions

int njb_init_state (njb_t *njb)
 
int njb_set_library_counter (njb_t *njb, u_int64_t count)
 
int njb_get_library_counter (njb_t *njb, njblibctr_t *lcount)
 
int njb_ping (njb_t *njb)
 
int njb_verify_last_command (njb_t *njb)
 
int njb_capture (njb_t *njb, int which)
 
int njb_get_track_tag_header (njb_t *njb, njbttaghdr_t *tagh, int cmd)
 
njb_songid_tnjb_get_track_tag (njb_t *njb, njbttaghdr_t *tagh)
 
int njb_get_playlist_header (njb_t *njb, njbplhdr_t *plh, int cmd)
 
njb_playlist_tnjb_get_playlist (njb_t *njb, njbplhdr_t *plh)
 
int njb_get_disk_usage (njb_t *njb, u_int64_t *total, u_int64_t *free_bytes)
 
int njb_get_owner_string (njb_t *njb, owner_string name)
 
int njb_set_owner_string (njb_t *njb, owner_string name)
 
int njb_get_datafile_header (njb_t *njb, njbdfhdr_t *dfh, int cmd)
 
njb_datafile_tnjb_get_datafile_tag (njb_t *njb, njbdfhdr_t *dfh)
 
u_int32_t njb_receive_file_block (njb_t *njb, u_int32_t offset, u_int32_t bsize, void *bp)
 
int njb_request_file (njb_t *njb, u_int32_t fileid)
 
int njb_transfer_complete (njb_t *njb)
 
int njb_send_track_tag (njb_t *njb, njbttaghdr_t *tagh, void *tag)
 
int njb_send_datafile_tag (njb_t *njb, njbdfhdr_t *dfh, void *tag)
 
u_int32_t njb_send_file_block (njb_t *njb, void *data, u_int32_t blocksize)
 
int njb_stop_play (njb_t *njb)
 
int njb_get_eax_size (njb_t *njb, u_int32_t *size)
 
void njb_read_eaxtypes (njb_t *njb, u_int32_t size)
 
njb_eax_tnjb_get_nexteax (njb_t *njb)
 
njb_time_tnjb_get_time (njb_t *njb)
 
int njb_set_time (njb_t *njb, njb_time_t *time)
 
int njb_create_playlist (njb_t *njb, char *name, u_int32_t *plid)
 
int njb_delete_playlist (njb_t *njb, u_int32_t plid)
 
int njb_rename_playlist (njb_t *njb, u_int32_t plid, char *name)
 
int njb_add_track_to_playlist (njb_t *njb, u_int32_t plid, u_int32_t trid)
 
int njb_add_multiple_tracks_to_playlist (njb_t *njb, u_int32_t plid, u_int32_t *trids, u_int16_t ntracks)
 
int njb_delete_track (njb_t *njb, u_int32_t trackid)
 
int njb_delete_datafile (njb_t *njb, u_int32_t fileid)
 
int njb_play_or_queue (njb_t *njb, u_int32_t trackid, int cmd)
 
int njb_elapsed_time (njb_t *njb, u_int16_t *elapsed, int *change)
 
int njb_replace_track_tag (njb_t *njb, njbttaghdr_t *tagh, void *tag)
 
int njb_adjust_sound (njb_t *njb, u_int8_t effect, int16_t value)
 

Variables

int __sub_depth
 

Detailed Description

This file contains the major parts of the NJB1 (OaSIS) protocol for all jukebox functionality.

Macro Definition Documentation

◆ NJB_STATUS

#define NJB_STATUS ( a,
b )
Value:
{ \
char *s = njb_status_string(b);\
njb_error_add_string(a,subroutinename,s);\
free (s); \
}

This returns the string representing an internal NJB1 error code.

Referenced by njb_get_datafile_header(), njb_get_disk_usage(), njb_get_library_counter(), njb_get_playlist_header(), njb_get_track_tag_header(), njb_ping(), njb_read_eaxtypes(), njb_receive_file_block(), and njb_verify_last_command().

Function Documentation

◆ njb_capture()

int njb_capture ( njb_t * njb,
int which )

This function captures the NJB1 device.

Parameters
njbis a pointer to the jukebox object to use.
Returns
0 on success, -1 on failure.

References EO_BADSTATUS, EO_USBCTL, and usb_setup().

Referenced by NJB_Capture(), and NJB_Release().

◆ njb_get_datafile_header()

int njb_get_datafile_header ( njb_t * njb,
njbdfhdr_t * dfh,
int cmd )

Retrieves a datafile header from the NJB1

Returns
0 on OK, -1 on error, -2 means the last header has already been returned.

References EO_USBCTL, njb1_bytes_to_32bit(), NJB_STATUS, and usb_setup().

◆ njb_get_disk_usage()

int njb_get_disk_usage ( njb_t * njb,
u_int64_t * total,
u_int64_t * free_bytes )

Get disk usage for the NJB1

Returns
0 on OK, -1 on failure, -2 means "try again"

References EO_USBCTL, njb1_bytes_to_64bit(), NJB_STATUS, and usb_setup().

Referenced by NJB_Get_Disk_Usage(), and NJB_Send_File().

◆ njb_get_library_counter()

int njb_get_library_counter ( njb_t * njb,
njblibctr_t * lcount )

This function gets the library counter from the device. The library counter is sent back and forth to the device to indicate if something in the library as changed.

Parameters
njbis a pointer to the jukebox object to use. @lcount is a pointer to the current library counter to get from the device.
Returns
0 on success, -1 on failure.

References data_dump(), EO_USBCTL, njb1_bytes_to_64bit(), njb_get_library_counter(), NJB_STATUS, and usb_setup().

Referenced by NJB_Capture(), njb_get_library_counter(), and NJB_Handshake().

◆ njb_get_nexteax()

njb_eax_t * njb_get_nexteax ( njb_t * njb)

This retrieves an EAX effect from the list of effects read in by the previous functions.

Parameters
njba pointer to the NJB object to use

References njb_eax_struct::next, and njb_struct::protocol_state.

Referenced by NJB_Get_EAX_Type().

◆ njb_get_playlist_header()

int njb_get_playlist_header ( njb_t * njb,
njbplhdr_t * plh,
int cmd )

Gets a playlist header.

Returns
0 on OK, -1 on error, -2 means "retry", -3 means "not found" or "last playlist already retrieved".

References EO_USBCTL, njb1_bytes_to_32bit(), NJB_STATUS, and usb_setup().

◆ njb_get_track_tag_header()

int njb_get_track_tag_header ( njb_t * njb,
njbttaghdr_t * tagh,
int cmd )

Get a track header from the NJB1.

Returns
0 on OK, -1 on error, -2 if the last header has been retrieved.

References EO_USBCTL, njb1_bytes_to_32bit(), NJB_STATUS, and usb_setup().

◆ njb_init_state()

int njb_init_state ( njb_t * njb)

Initializes the basic state of the njb->protocol_state for the NJB1-device.

Parameters
njbis a pointer to the jukebox object to use.
Returns
0 on success, -1 on failure.

References njb_state_t::power, njb_struct::protocol_state, and njb_state_t::sdmiid.

Referenced by NJB_Open().

◆ njb_ping()

int njb_ping ( njb_t * njb)

This function pings the NJB1 device to see if it is up and running, and ready for action. This is done every now and then.

Parameters
njbis a pointer to the jukebox object to use.
Returns
0 on success, -1 on failure.

References data_dump(), EO_RDSHORT, EO_USBBLK, EO_USBCTL, njb_state_t::fwMajor, njb_state_t::fwMinor, NJB_STATUS, njb_state_t::power, njb_state_t::productName, njb_struct::protocol_state, njb_state_t::sdmiid, usb_pipe_read(), and usb_setup().

Referenced by NJB_Handshake(), and NJB_Ping().

◆ njb_read_eaxtypes()

void njb_read_eaxtypes ( njb_t * njb,
u_int32_t size )

This reads in the block with EAX types. It is a byte chunk which is then interpreted and the EAX effects are added to a list of effects which is then retrieved by calls to the njb_get_nexteax() function.

Parameters
njba pointer to the NJB object to use
sizethe previously determined size of the EAX block

References eax_unpack(), EO_NOMEM, EO_RDSHORT, EO_USBBLK, EO_USBCTL, from_32bit_to_njb1_bytes(), njb1_bytes_to_32bit(), NJB_STATUS, njb_struct::protocol_state, usb_pipe_read(), and usb_setup().

Referenced by NJB_Reset_Get_EAX_Type().

◆ njb_receive_file_block()

u_int32_t njb_receive_file_block ( njb_t * njb,
u_int32_t offset,
u_int32_t bsize,
void * bp )

offset is the offset into the file, starting at 0. bsize indicates the recieved buffer max size. bp points to the recieve buffer (atleast NJB_XFER_BLOCK_SIZE + NJB_XFER_BLOCK_HEADER_SIZE) lastsort indicates if last transfer was short (ended before requested number of bytes were recieved).

If lastshort == 1, the last call to this function returned a a short read. In that case, a new setup command shall not be sent, the bus shall just keep retrieveing buffer contents from the bulk pipe.

References EO_TOOBIG, EO_USBBLK, EO_USBCTL, from_32bit_to_njb1_bytes(), NJB_STATUS, usb_pipe_read(), and usb_setup().

Referenced by NJB_Get_Track_fd().

◆ njb_set_library_counter()

int njb_set_library_counter ( njb_t * njb,
u_int64_t count )

This function sets the library counter on the device. The library counter is sent back and forth to the device to indicate if something in the library has changed.

Parameters
njbis a pointer to the jukebox object to use.
countis the current library counter to set on the device.
Returns
0 on success, -1 on failure.

References EO_USBCTL, from_64bit_to_njb1_bytes(), and usb_setup().

Referenced by NJB_Handshake().

◆ njb_verify_last_command()

int njb_verify_last_command ( njb_t * njb)

This function verifies if the last command was successful or not.

Parameters
njbis a pointer to the jukebox object to use.
Returns
0 on success, -1 on failure.

References EO_USBCTL, NJB_STATUS, and usb_setup().

Referenced by NJB_Get_Track_fd(), NJB_Handshake(), NJB_Play_Track(), NJB_Queue_Track(), NJB_Set_Owner_String(), NJB_Set_Time(), and NJB_Update_Playlist().

Variable Documentation

◆ __sub_depth

int __sub_depth
extern

The current subroutine depth for all of libnjb (global)