/* 
 | 
 * BlueALSA - ctl-proto.h 
 | 
 * Copyright (c) 2016-2018 Arkadiusz Bokowy 
 | 
 * 
 | 
 * This file is a part of bluez-alsa. 
 | 
 * 
 | 
 * This project is licensed under the terms of the MIT license. 
 | 
 * 
 | 
 */ 
 | 
  
 | 
#ifndef BLUEALSA_SHARED_CTLPROTO_H_ 
 | 
#define BLUEALSA_SHARED_CTLPROTO_H_ 
 | 
  
 | 
#if HAVE_CONFIG_H 
 | 
# include "config.h" 
 | 
#endif 
 | 
  
 | 
#include <stdint.h> 
 | 
#include <bluetooth/bluetooth.h> 
 | 
  
 | 
/* Location where the control socket and pipes are stored. */ 
 | 
#define BLUEALSA_RUN_STATE_DIR RUN_STATE_DIR "/bluealsa" 
 | 
/* Version of the controller communication protocol. */ 
 | 
#define BLUEALSA_CRL_PROTO_VERSION 0x0300 
 | 
  
 | 
enum ba_command { 
 | 
    BA_COMMAND_PING, 
 | 
    BA_COMMAND_SUBSCRIBE, 
 | 
    BA_COMMAND_LIST_DEVICES, 
 | 
    BA_COMMAND_LIST_TRANSPORTS, 
 | 
    BA_COMMAND_TRANSPORT_GET, 
 | 
    BA_COMMAND_TRANSPORT_SET_DELAY, 
 | 
    BA_COMMAND_TRANSPORT_SET_VOLUME, 
 | 
    BA_COMMAND_PCM_OPEN, 
 | 
    BA_COMMAND_PCM_CLOSE, 
 | 
    BA_COMMAND_PCM_PAUSE, 
 | 
    BA_COMMAND_PCM_RESUME, 
 | 
    BA_COMMAND_PCM_DRAIN, 
 | 
    BA_COMMAND_RFCOMM_SEND, 
 | 
    __BA_COMMAND_MAX 
 | 
}; 
 | 
  
 | 
enum ba_status_code { 
 | 
    BA_STATUS_CODE_SUCCESS = 0, 
 | 
    BA_STATUS_CODE_ERROR_UNKNOWN, 
 | 
    BA_STATUS_CODE_DEVICE_NOT_FOUND, 
 | 
    BA_STATUS_CODE_STREAM_NOT_FOUND, 
 | 
    BA_STATUS_CODE_DEVICE_BUSY, 
 | 
    BA_STATUS_CODE_FORBIDDEN, 
 | 
    BA_STATUS_CODE_PONG, 
 | 
}; 
 | 
  
 | 
enum ba_event { 
 | 
    BA_EVENT_TRANSPORT_ADDED   = 1 << 0, 
 | 
    BA_EVENT_TRANSPORT_CHANGED = 1 << 1, 
 | 
    BA_EVENT_TRANSPORT_REMOVED = 1 << 2, 
 | 
    BA_EVENT_UPDATE_BATTERY    = 1 << 3, 
 | 
    BA_EVENT_UPDATE_VOLUME     = 1 << 4, 
 | 
}; 
 | 
  
 | 
enum ba_pcm_type { 
 | 
    BA_PCM_TYPE_NULL = 0, 
 | 
    BA_PCM_TYPE_A2DP, 
 | 
    BA_PCM_TYPE_SCO, 
 | 
}; 
 | 
  
 | 
enum ba_pcm_stream { 
 | 
    BA_PCM_STREAM_PLAYBACK, 
 | 
    BA_PCM_STREAM_CAPTURE, 
 | 
    /* Special stream type returned by the LIST_TRANSPORTS command to indicate, 
 | 
     * that given transport can act as a playback and capture device. In order 
 | 
     * to open PCM for such a transport, one has to provide one of PLAYBACK or 
 | 
     * CAPTURE stream types. */ 
 | 
    BA_PCM_STREAM_DUPLEX, 
 | 
}; 
 | 
  
 | 
struct __attribute__ ((packed)) ba_request { 
 | 
  
 | 
    enum ba_command command; 
 | 
  
 | 
    /* selected device address */ 
 | 
    bdaddr_t addr; 
 | 
  
 | 
    /* requested transport type */ 
 | 
    enum ba_pcm_type type; 
 | 
    enum ba_pcm_stream stream; 
 | 
  
 | 
    union { 
 | 
  
 | 
        /* bit-mask with event subscriptions 
 | 
         * used by BA_COMMAND_SUBSCRIBE */ 
 | 
        enum ba_event events; 
 | 
  
 | 
        /* transport delay 
 | 
         * used by BA_COMMAND_TRANSPORT_SET_DELAY */ 
 | 
        uint16_t delay; 
 | 
  
 | 
        /* transport volume fields 
 | 
         * used by BA_COMMAND_TRANSPORT_SET_VOLUME */ 
 | 
        struct { 
 | 
            uint8_t ch1_muted:1; 
 | 
            uint8_t ch1_volume:7; 
 | 
            uint8_t ch2_muted:1; 
 | 
            uint8_t ch2_volume:7; 
 | 
        }; 
 | 
  
 | 
        /* RFCOMM command string to send 
 | 
         * used by BA_COMMAND_RFCOMM_SEND */ 
 | 
        char rfcomm_command[32]; 
 | 
  
 | 
    }; 
 | 
  
 | 
}; 
 | 
  
 | 
/** 
 | 
 * Single byte status message send by the controller at the end of every 
 | 
 * response. This message contains the overall request status, which could 
 | 
 * indicate either success or error. */ 
 | 
struct __attribute__ ((packed)) ba_msg_status { 
 | 
    uint8_t code; 
 | 
}; 
 | 
  
 | 
struct __attribute__ ((packed)) ba_msg_event { 
 | 
    /* bit-mask with events */ 
 | 
    enum ba_event mask; 
 | 
}; 
 | 
  
 | 
struct __attribute__ ((packed)) ba_msg_device { 
 | 
  
 | 
    /* device address */ 
 | 
    bdaddr_t addr; 
 | 
    /* name obtained from the Bluetooth device itself */ 
 | 
    char name[32]; 
 | 
  
 | 
    /* determine whether battery is available */ 
 | 
    uint8_t battery:1; 
 | 
    /* device battery level in range [0, 100] */ 
 | 
    uint8_t battery_level:7; 
 | 
  
 | 
}; 
 | 
  
 | 
struct __attribute__ ((packed)) ba_msg_transport { 
 | 
  
 | 
    /* device address for which the transport is created */ 
 | 
    bdaddr_t addr; 
 | 
  
 | 
    /* selected profile and audio codec */ 
 | 
    enum ba_pcm_type type; 
 | 
    enum ba_pcm_stream stream; 
 | 
    uint8_t codec; 
 | 
  
 | 
    /* number of audio channels */ 
 | 
    uint8_t channels; 
 | 
    /* used sampling frequency */ 
 | 
    uint32_t sampling; 
 | 
  
 | 
    /* Levels for channel 1 (left) and 2 (right). These fields are also 
 | 
     * used for SCO. In such a case channel 1 and 2 is responsible for 
 | 
     * respectively playback and capture. */ 
 | 
    uint8_t ch1_muted:1; 
 | 
    uint8_t ch1_volume:7; 
 | 
    uint8_t ch2_muted:1; 
 | 
    uint8_t ch2_volume:7; 
 | 
  
 | 
    /* transport delay in 1/10 of millisecond */ 
 | 
    uint16_t delay; 
 | 
  
 | 
}; 
 | 
  
 | 
#endif 
 |