Commit 116bacde authored by Lauros Pajunen's avatar Lauros Pajunen
Browse files

Begin audio focus PI implementation

parent 4aca7e15
Loading
Loading
Loading
Loading
+32 −4
Original line number Diff line number Diff line
@@ -216,8 +216,8 @@ static const char *PiDataNames[IVAS_PI_MAX_ID] = {
    "SCENE_ORIENTATION", "DEVICE_ORIENTATION_COMPENSATED", "DEVICE_ORIENTATION_UNCOMPENSATED",
    "ACOUSTIC_ENVIRONMENT", "AUDIO_DESCRIPTION", "ISM_NUM", "ISM_ID", "ISM_GAIN", "ISM_ORIENTATION",
    "ISM_POSITION", "ISM_DISTANCE_ATTENUATION", "ISM_DIRECTIVITY", "DIEGETIC_TYPE", "RESERVED13",
    "RESERVED14", "RESERVED15", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION",
    "DYNAMIC_AUDIO_SUPPRESSION", "AUDIO_FOCUS_DIRECTION", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN",
    "AUDIO_FOCUS_INDICATION", "RESERVED15", "PLAYBACK_DEVICE_ORIENTATION", "HEAD_ORIENTATION", "LISTENER_POSITION",
    "DYNAMIC_AUDIO_SUPPRESSION", "AUDIO_FOCUS_REQUEST", "PI_LATENCY", "R_ISM_ID", "R_ISM_GAIN",
    "R_ISM_ORIENTATION", "R_ISM_POSITION", "R_ISM_DIRECTION", "RESERVED27", "RESERVED28", "RESERVED29",
    "RESERVED30", "NO_DATA"
};
@@ -261,7 +261,6 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n
#ifdef RTP_S4_251135_CR26253_0016_REV1
            case IVAS_PI_PLAYBACK_DEVICE_ORIENTATION:
            case IVAS_PI_HEAD_ORIENTATION:
            case IVAS_PI_AUDIO_FOCUS_DIRECTION:
            case IVAS_PI_R_ISM_ORIENTATION:
#endif
            {
@@ -327,6 +326,21 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n
                fprintf( f_piDataOut, "\t\t\t]\n\t\t}" );
            }
            break;
            case IVAS_PI_AUDIO_FOCUS_INDICATION:
            {
                fprintf( f_piDataOut, "{\n" );
                if ( cur->data.focusIndication.availDirection )
                {
                    fprintf( f_piDataOut, "\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t\t",
                             cur->data.focusIndication.direction.w, cur->data.focusIndication.direction.x, cur->data.focusIndication.direction.y, cur->data.focusIndication.direction.z );
                }
                if ( cur->data.focusIndication.availLevel )
                {
                    fprintf( f_piDataOut, "\t\t\t\"level\": %d", cur->data.focusIndication.flvl );
                }
                fprintf( f_piDataOut, "\n\t\t}" );
            }
            break;
            case IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION:
            {
                IVAS_PIDATA_DYNAMIC_SUPPRESSION *das = &cur->data.dynSuppression;
@@ -339,7 +353,21 @@ static void IVAS_RTP_LogPiData( FILE *f_piDataOut, PIDATA_TS *piData, uint32_t n
            }
            break;
            case IVAS_PI_RESERVED13:
            case IVAS_PI_RESERVED14:
            case IVAS_PI_AUDIO_FOCUS_REQUEST:
            {
                fprintf( f_piDataOut, "{\n" );
                if ( cur->data.focusRequest.availDirection )
                {
                    fprintf( f_piDataOut, "\t\t\t\"w\": %f,\n\t\t\t\"x\": %f,\n\t\t\t\"y\": %f,\n\t\t\t\"z\": %f \n\t\t\t",
                             cur->data.focusRequest.direction.w, cur->data.focusRequest.direction.x, cur->data.focusRequest.direction.y, cur->data.focusRequest.direction.z );
                }
                if ( cur->data.focusRequest.availLevel )
                {
                    fprintf( f_piDataOut, "\t\t\t\"level\": %d", cur->data.focusRequest.flvl );
                }
                fprintf( f_piDataOut, "\n\t\t}" );
            }
            break;
            case IVAS_PI_RESERVED15:
            case IVAS_PI_RESERVED27:
            case IVAS_PI_RESERVED28:
+96 −7
Original line number Diff line number Diff line
@@ -132,7 +132,7 @@ static ivas_error packOrientation( const IVAS_PIDATA_GENERIC *piData, uint8_t *b

    if ( ( piData->piDataType != IVAS_PI_SCENE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_COMPENSATED ) && ( piData->piDataType != IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED )
#ifdef RTP_S4_251135_CR26253_0016_REV1
         && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION ) && ( piData->piDataType != IVAS_PI_AUDIO_FOCUS_DIRECTION )
         && ( piData->piDataType != IVAS_PI_PLAYBACK_DEVICE_ORIENTATION ) && ( piData->piDataType != IVAS_PI_HEAD_ORIENTATION )
#endif /* RTP_S4_251135_CR26253_0016_REV1 */
    )
    {
@@ -544,6 +544,95 @@ static ivas_error unpackDiegetic( const uint8_t *buffer, uint32_t numDataBytes,
    return IVAS_ERR_OK;
}

static ivas_error packAudioFocusCommon( const IVAS_PIDATA_GENERIC *piData, uint8_t *buffer, uint32_t maxDataBytes, uint32_t *nBytesWritten )
{
    uint32_t nBytes = 0;
    uint8_t packedSize = 1;
    const IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (const IVAS_PIDATA_AUDIO_FOCUS *) piData;

    *nBytesWritten = 0;

    if ( piData->size != sizeof( IVAS_PIDATA_AUDIO_FOCUS ) )
    {
        return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Incorrect size in PI data of type Audio Focus" );
    }

    if ( audioFocus->availDirection && audioFocus->availLevel )
    {
        packedSize = 9;
    }
    else if ( audioFocus->availDirection )
    {
        packedSize = 8;
    }
    else if ( audioFocus->availLevel )
    {
        packedSize = 1;
    }
    else
    {
        return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Neither direction or level is available for packing Audio Focus" );
    }

    /* Audio Focus data is packedSize bytes, header is 2 bytes */
    if ( maxDataBytes < (uint32_t) packedSize + 2 )
    {
        return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Insufficient space to pack Audio Focus PI data" );
    }

    buffer[nBytes++] = ( audioFocus->piDataType & MASK_5BIT ); /* PF/PM populated during final packing */
    buffer[nBytes++] = packedSize;

    if ( packedSize == 9 || packedSize == 8 )
    {
        nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.w ) );
        nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.x ) );
        nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.y ) );
        nBytes = writeInt16( buffer, nBytes, ivasPayload_convertToQ15( audioFocus->direction.z ) );
    }
    if ( packedSize == 9 || packedSize == 1)
    {
        buffer[nBytes++] = ( (uint8_t) audioFocus->flvl & MASK_4BIT ) << 4;
    }

    *nBytesWritten = nBytes;
    return IVAS_ERR_OK;
}

static ivas_error unpackAudioFocusCommon( const uint8_t *buffer, uint32_t numDataBytes, IVAS_PIDATA_GENERIC *piData )
{
    IVAS_PIDATA_AUDIO_FOCUS *audioFocus = (IVAS_PIDATA_AUDIO_FOCUS *) piData;

    /* Audio Focus data is either 1, 8 or 9 bytes */
    if ( numDataBytes != 1 && numDataBytes != 8 && numDataBytes != 9 )
    {
        return IVAS_ERROR( IVAS_ERR_RTP_UNPACK_PI_DATA, "Incorrect size to unpack PI data of type Audio Focus" );
    }

    piData->size = sizeof( IVAS_PIDATA_AUDIO_FOCUS );
    audioFocus->availDirection = ( numDataBytes >= 8 );
    audioFocus->availLevel = ( numDataBytes == 1 || numDataBytes == 9 );

    if ( numDataBytes == 1 )
    {
        audioFocus->flvl = ( buffer[0] >> 4 );
    }
    else
    {
        audioFocus->direction.w = FLOAT_FROM_Q15( readInt16( &buffer[0] ) );
        audioFocus->direction.x = FLOAT_FROM_Q15( readInt16( &buffer[2] ) );
        audioFocus->direction.y = FLOAT_FROM_Q15( readInt16( &buffer[4] ) );
        audioFocus->direction.z = FLOAT_FROM_Q15( readInt16( &buffer[6] ) );

        if ( numDataBytes == 9 )
        {
            audioFocus->flvl = ( buffer[8] >> 4 );
        }
    }

    return IVAS_ERR_OK;
}


#endif /* RTP_S4_251135_CR26253_0016_REV1 */

@@ -570,14 +659,14 @@ static const PACK_PI_FN packPiDataFuntions[IVAS_PI_MAX_ID] = {
    packUnsupportedData,   /* DIEGETIC_TYPE                    */
#endif
    packUnsupportedData, /* RESERVED13                       */
    packUnsupportedData, /* RESERVED14                       */
    packAudioFocusCommon,/* AUDIO_FOCUS_INDICATION           */
    packUnsupportedData, /* RESERVED15                       */
#ifdef RTP_S4_251135_CR26253_0016_REV1
    packOrientation,        /* PLAYBACK_DEVICE_ORIENTATION      */
    packOrientation,        /* HEAD_ORIENTATION                 */
    packListenerPosition,   /* LISTENER_POSITION                */
    packDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION        */
    packOrientation,        /* AUDIO_FOCUS_DIRECTION            */
    packAudioFocusCommon,   /* AUDIO_FOCUS_REQUEST              */
#else
    packUnsupportedData,   /* PLAYBACK_DEVICE_ORIENTATION      */
    packUnsupportedData,   /* HEAD_ORIENTATION                 */
@@ -625,14 +714,14 @@ static const UNPACK_PI_FN unpackPiDataFuntions[IVAS_PI_MAX_ID] = {
    unpackUnsupportedData, /* DIEGETIC_TYPE                    */
#endif
    unpackUnsupportedData, /* RESERVED13                       */
    unpackUnsupportedData, /* RESERVED14                       */
    unpackAudioFocusCommon,/* AUDIO_FOCUS_INDICATION           */
    unpackUnsupportedData, /* RESERVED15                       */
#ifdef RTP_S4_251135_CR26253_0016_REV1
    unpackOrientation,        /* PLAYBACK_DEVICE_ORIENTATION      */
    unpackOrientation,        /* HEAD_ORIENTATION                 */
    unpackListenerPosition,   /* LISTENER_POSITION                */
    unpackDynamicSuppression, /* DYNAMIC_AUDIO_SUPPRESSION        */
    unpackOrientation,        /* AUDIO_FOCUS_DIRECTION            */
    unpackAudioFocusCommon,   /* AUDIO_FOCUS_REQUEST              */
#else
    unpackUnsupportedData, /* PLAYBACK_DEVICE_ORIENTATION      */
    unpackUnsupportedData, /* HEAD_ORIENTATION                 */
@@ -672,13 +761,13 @@ static const uint32_t maxPiDataSize[IVAS_PI_MAX_ID] = {
    8,  /* IVAS_PI_ISM_DIRECTIVITY                  */
    1,  /* IVAS_PI_DIEGETIC_TYPE                    */
    0,  /* IVAS_PI_RESERVED13                       */
    0,  /* IVAS_PI_RESERVED14                       */
    9,  /* IVAS_PI_AUDIO_FOCUS_INDICATION           */
    0,  /* IVAS_PI_RESERVED15                       */
    8,  /* IVAS_PI_PLAYBACK_DEVICE_ORIENTATION      */
    8,  /* IVAS_PI_HEAD_ORIENTATION                 */
    6,  /* IVAS_PI_LISTENER_POSITION                */
    2,  /* IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION        */
    8,  /* IVAS_PI_AUDIO_FOCUS_DIRECTION            */
    9,  /* IVAS_PI_AUDIO_FOCUS_REQUEST              */
    4,  /* IVAS_PI_PI_LATENCY                       */
    1,  /* IVAS_PI_R_ISM_ID                         */
    1,  /* IVAS_PI_R_ISM_GAIN                       */
+38 −4
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ extern "C"
        IVAS_PI_ISM_DIRECTIVITY,          /* directivity of each object */
        IVAS_PI_DIEGETIC_TYPE,            /* digetic audio indication */
        IVAS_PI_RESERVED13,               /* reserved */
        IVAS_PI_RESERVED14,               /* reserved */
        IVAS_PI_AUDIO_FOCUS_INDICATION,   /* audio focus indication (direction in Quaternions and/or level) */
        IVAS_PI_RESERVED15,               /* reserved */

        /* Reverse direction PI types */
@@ -72,7 +72,7 @@ extern "C"
        IVAS_PI_HEAD_ORIENTATION,            /* head orientation of the listener in Quaternions */
        IVAS_PI_LISTENER_POSITION,           /* position of the listener in 3D space */
        IVAS_PI_DYNAMIC_AUDIO_SUPPRESSION,   /* receiver’s preference with respect to audio suppression */
        IVAS_PI_AUDIO_FOCUS_DIRECTION,       /* direction of interest for the listener in Quaternions */
        IVAS_PI_AUDIO_FOCUS_REQUEST,         /* direction of interest for the listener in Quaternions and/or audio focus level */
        IVAS_PI_PI_LATENCY,                  /* round-trip latency for PI frames */
        IVAS_PI_R_ISM_ID,                    /* id of an object for editing */
        IVAS_PI_R_ISM_GAIN,                  /* editing request for gain factor for received object */
@@ -100,7 +100,6 @@ extern "C"
     *   - IVAS_PI_DEVICE_ORIENTATION_UNCOMPENSATED
     *   - IVAS_PI_PLAYBACK_DEVICE_ORIENTATION
     *   - IVAS_PI_HEAD_ORIENTATION
     *   - IVAS_PI_AUDIO_FOCUS_DIRECTION
     *   - IVAS_PI_R_ISM_ORIENTATION
     *
     * piDataType is used to identify the correct pi data type contained here
@@ -293,6 +292,40 @@ extern "C"
        bool isDiegetic[1 + IVAS_PI_MAX_OBJECTS]; /* diegetic indication as per audio format */
    } IVAS_PIDATA_DIEGETIC;

    /* Audio focus direction indicates a direction of interest.
     * The audio focus level indicates the amount of suppression applied to the
     * directions other than the audio focus direction.
     */
    typedef enum
    {
        IVAS_FLVL_NO_AUDIO_FOCUS = 0,   /* Apply no audio focus  */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_1,  /* Audio focus level 1   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_2,  /* Audio focus level 2   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_3,  /* Audio focus level 3   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_4,  /* Audio focus level 4   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_5,  /* Audio focus level 5   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_6,  /* Audio focus level 6   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_7,  /* Audio focus level 7   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_8,  /* Audio focus level 8   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_9,  /* Audio focus level 9   */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_10, /* Audio focus level 10  */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_11, /* Audio focus level 11  */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_12, /* Audio focus level 12  */
        IVAS_FLVL_FOCUS_LEVEL_LEVEL_13, /* Audio focus level 13  */
        IVAS_FLVL_DEFAULT_AUDIO_FOCUS,  /* Default audio focus   */
        IVAS_FLVL_MAX_AUDIO_FOCUS,      /* Apply max audio focus */
    } IVAS_FLVL;

    typedef struct
    {
        size_t size;                 /* sizeof(IVAS_PIDATA_AUDIO_FOCUS)     */
        uint32_t piDataType;         /* IVAS_PI_AUDIO_FOCUS_INDCATION or IVAS_PI_AUDIO_FOCUS_REQUEST   */
        bool availDirection;         /* audio focus contains direction  */
        bool availLevel;             /* audio focus contains level      */
        IVAS_QUATERNION direction;   /* direction data expressed as quarternions */
        IVAS_FLVL flvl;              /* audio focus level */
    } IVAS_PIDATA_AUDIO_FOCUS;

    /* Listener position */
    typedef struct
    {
@@ -416,12 +449,13 @@ extern "C"
        IVAS_PIDATA_ISM_ATTENUATION ismAttenuation;
        IVAS_PIDATA_ISM_DIRECTIVITY ismDirectivity;
        IVAS_PIDATA_DIEGETIC digeticIndicator;
        IVAS_PIDATA_AUDIO_FOCUS focusIndication;

        IVAS_PIDATA_ORIENTATION playbackOrientation;
        IVAS_PIDATA_ORIENTATION headOrientation;
        IVAS_PIDATA_LISTENER_POSITION listnerPosition;
        IVAS_PIDATA_DYNAMIC_SUPPRESSION dynSuppression;
        IVAS_PIDATA_ORIENTATION focusDirection;
        IVAS_PIDATA_AUDIO_FOCUS focusRequest;
        IVAS_PIDATA_REVERSE_PI_LATENCY piLatency;
        IVAS_PIDATA_ISM_EDIT_ID ismEditId;
        IVAS_PIDATA_ISM_EDIT_GAIN ismEditGain;
+30 −4
Original line number Diff line number Diff line
@@ -170,13 +170,13 @@ class PIDATAS(str, Enum):
    ISM_DIRECTIVITY = "ISM_DIRECTIVITY"
    DIEGETIC_TYPE = "DIEGETIC_TYPE"
    RESERVED13 = "RESERVED13"
    RESERVED14 = "RESERVED14"
    AUDIO_FOCUS_INDICATION = "AUDIO_FOCUS_INDICATION"
    RESERVED15 = "RESERVED15"
    PLAYBACK_DEVICE_ORIENTATION = "PLAYBACK_DEVICE_ORIENTATION"
    HEAD_ORIENTATION = "HEAD_ORIENTATION"
    LISTENER_POSITION = "LISTENER_POSITION"
    DYNAMIC_AUDIO_SUPPRESSION = "DYNAMIC_AUDIO_SUPPRESSION"
    AUDIO_FOCUS_DIRECTION = "AUDIO_FOCUS_DIRECTION"
    AUDIO_FOCUS_REQUEST = "AUDIO_FOCUS_REQUEST"
    PI_LATENCY = "PI_LATENCY"
    R_ISM_ID = "R_ISM_ID"
    R_ISM_GAIN = "R_ISM_GAIN"
@@ -207,6 +207,24 @@ class SUPPRESSION_LEVEL(int, Enum):
    SUPPRESSION_LEVEL_14 = 14
    SUPPRESSION_LEVEL_MAX = 15

class AUDIO_FOCUS_LEVEL(int, Enum):
    AUDIO_FOCUS_LEVEL_NONE = 0
    AUDIO_FOCUS_LEVEL_1 = 1
    AUDIO_FOCUS_LEVEL_2 = 2
    AUDIO_FOCUS_LEVEL_3 = 3
    AUDIO_FOCUS_LEVEL_4 = 4
    AUDIO_FOCUS_LEVEL_5 = 5
    AUDIO_FOCUS_LEVEL_6 = 6
    AUDIO_FOCUS_LEVEL_7 = 7
    AUDIO_FOCUS_LEVEL_8 = 8
    AUDIO_FOCUS_LEVEL_9 = 9
    AUDIO_FOCUS_LEVEL_10 = 10
    AUDIO_FOCUS_LEVEL_11 = 11
    AUDIO_FOCUS_LEVEL_12 = 12
    AUDIO_FOCUS_LEVEL_13 = 13
    AUDIO_FOCUS_LEVEL_DEFAULT = 14
    AUDIO_FOCUS_LEVEL_NO_PREFERENCE = 15


@dataclass
class RTPHDR:
@@ -343,6 +361,14 @@ class ACOUSTIC_ENVIRONMENT:
    dim: tuple[float, float, float] = ()
    abscoeff: tuple[float, float, float, float, float, float] = ()

@dataclass
class AUDIO_FOCUS:
    w: float = 0.0
    x: float = 0.0
    y: float = 0.0
    z: float = 0.0
    level: AUDIO_FOCUS_LEVEL = AUDIO_FOCUS_LEVEL.AUDIO_FOCUS_LEVEL_DEFAULT

@dataclass
class PIDATA:
    timestamp: int = 0
@@ -589,13 +615,13 @@ PIDataUnpacker = [
    unpackUnsupported, # ISM_DIRECTIVITY
    unpackDiegetic,    # DIEGETIC_TYPE
    unpackUnsupported, # RESERVED13
    unpackUnsupported, # RESERVED14
    unpackAudioFocusCommon, # AUDIO_FOCUS_INDICATION
    unpackUnsupported, # RESERVED15
    unpackOrientation, # PLAYBACK_DEVICE_ORIENTATION
    unpackOrientation, # HEAD_ORIENTATION
    unpackPosition,    # LISTENER_POSITION
    unpackDAS,         # DYNAMIC_AUDIO_SUPPRESSION
    unpackOrientation, # AUDIO_FOCUS_DIRECTION
    unpackAudioFocusCommon, # AUDIO_FOCUS_REQUEST
    unpackUnsupported, # PI_LATENCY
    unpackUnsupported, # R_ISM_ID
    unpackUnsupported, # R_ISM_GAIN
+2 −1
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ def generatePiData(startTs: int, endTs: int) -> dict:
    someDesc = lambda : AUDIO_DESCRIPTION(isSpeech=bool(random.getrandbits(1)), isMusic=bool(random.getrandbits(1)), isAmbiance=bool(random.getrandbits(1)), isEditable=bool(random.getrandbits(1)), isBinaural=bool(random.getrandbits(1)))
    someDAS = lambda : DYNAMIC_AUDIO_SUPPRESSION(preferSpeech=bool(random.getrandbits(1)), preferMusic=bool(random.getrandbits(1)), preferAmbiance=bool(random.getrandbits(1)), level=random.randint(0, 15))
    someDIG = lambda : DIEGETIC_TYPE(isDigetic=[ bool(random.getrandbits(1)) for _ in range(random.randint(1, 5)) ])
    someAFocus = lambda : AUDIO_FOCUS(w=2*random.random()-1.0, x=2*random.random()-1.0, y=2*random.random()-1.0, z=2*random.random()-1.0, level=random.randint(0, 15))

    for ts in range(startTs, endTs, 320):
        pidata = dict()
@@ -172,7 +173,7 @@ def generatePiData(startTs: int, endTs: int) -> dict:
        pidata["DEVICE_ORIENTATION_UNCOMPENSATED"] = someOrientation()
        pidata["PLAYBACK_DEVICE_ORIENTATION"] = someOrientation()
        pidata["HEAD_ORIENTATION"] = someOrientation()
        pidata["AUDIO_FOCUS_DIRECTION"] = someOrientation()
        pidata["AUDIO_FOCUS_REQUEST"] = someAFocus()
        pidata["LISTENER_POSITION"] = somePosition()
        pidata["DYNAMIC_AUDIO_SUPPRESSION"] = someDAS()
        pidata["AUDIO_DESCRIPTION"] = [someDesc() for n in range(random.randint(1, 5))]