Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
390 changes: 341 additions & 49 deletions src/audio/tdfb/tdfb.c

Large diffs are not rendered by default.

22 changes: 21 additions & 1 deletion src/include/sof/audio/tdfb/tdfb_comp.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,40 @@
#define TDFB_IN_BUF_LENGTH (2 * PLATFORM_MAX_CHANNELS)
#define TDFB_OUT_BUF_LENGTH (2 * PLATFORM_MAX_CHANNELS)

/* When set to one only one IPC is sent to host. There is not other requests
* triggered. If set to zero the IPC sent will be empty and the driver will
* issue an actual control get. In simple case with known # of control channels
* including is more efficient.
*/
#define TDFB_ADD_DIRECTION_TO_GET_CMD 1

/* Allocate size is header plus single control value */
#define TDFB_GET_CTRL_DATA_SIZE (sizeof(struct sof_ipc_ctrl_data) + \
sizeof(struct sof_ipc_ctrl_value_chan))

/* TDFB component private data */

struct tdfb_comp_data {
struct fir_state_32x16 fir[SOF_TDFB_FIR_MAX_COUNT]; /**< FIR state */
struct comp_data_blob_handler *model_handler;
struct sof_tdfb_config *config; /**< pointer to setup blob */
struct sof_tdfb_angle *filter_angles;
struct sof_tdfb_mic_location *mic_locations;
struct sof_ipc_ctrl_data *ctrl_data;
struct ipc_msg *msg;
int32_t in[TDFB_IN_BUF_LENGTH]; /**< input samples buffer */
int32_t out[TDFB_IN_BUF_LENGTH]; /**< output samples mix buffer */
int32_t *fir_delay; /**< pointer to allocated RAM */
int16_t *input_channel_select; /**< For each FIR define in ch */
int16_t *output_channel_mix; /**< For each FIR define out ch */
int16_t *output_stream_mix; /**< for each FIR define stream */
int16_t az_value; /**< beam steer azimuth as in control enum */
int16_t az_value_estimate; /**< beam steer azimuth as in control enum */
size_t fir_delay_size; /**< allocated size */
bool config_ready; /**< set when fully received */
int direction_updates:1; /**< set true if direction angle control is updated */
int direction_change:1; /**< set if direction value has significant change */
int beam_on:1; /**< set true if beam is off */
int update:1; /**< set true if control enum has been received */
void (*tdfb_func)(struct tdfb_comp_data *cd,
const struct audio_stream *source,
struct audio_stream *sink,
Expand Down
32 changes: 28 additions & 4 deletions src/include/user/tdfb.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@

#define SOF_TDFB_MAX_SIZE 4096 /* Max size for coef data in bytes */
#define SOF_TDFB_FIR_MAX_LENGTH 256 /* Max length for individual filter */
#define SOF_TDFB_FIR_MAX_COUNT 16 /* A blob can define max 8 FIR EQs */
#define SOF_TDFB_FIR_MAX_COUNT 16 /* A blob can define max 16 FIR EQs */
#define SOF_TDFB_MAX_STREAMS 8 /* Support 1..8 sinks */
#define SOF_TDFB_MAX_ANGLES 360 /* Up to 1 degree precision for 360 degrees coverage */
#define SOF_TDFB_MAX_MICROPHONES 16 /* Up to 16 microphone locations */

/*
* sof_tdfb_config data[]
Expand All @@ -31,14 +33,36 @@
struct sof_tdfb_config {
uint32_t size; /* Size of entire struct */
uint16_t num_filters; /* Total number of filters */
uint16_t num_output_channels; /* Total number of output channels */
uint16_t num_output_channels; /* Total number of output channels */
uint16_t num_output_streams; /* one source, N output sinks */
uint16_t reserved16; /* To keep data 32 bit aligned */

/* Since ABI version 3.19 */
uint16_t num_mic_locations; /* Number of microphones locations entries */
uint16_t num_angles; /* Number of steer angles in data, not counting beam off */
uint16_t beam_off_defined; /* Set if a beam off filters configuration is present */
uint16_t track_doa; /* Track direction of arrival angle */
int16_t angle_enum_mult; /* Multiply enum value (0..15) to get angle in degrees */
int16_t angle_enum_offs; /* After multiplication add this degrees offset to angle */

/* reserved */
uint32_t reserved32[4]; /* For future */
uint16_t reserved16; /* To keep data 32 bit aligned */
uint32_t reserved32[1]; /* For future */

int16_t data[];
} __attribute__((packed));

struct sof_tdfb_angle {
int16_t azimuth; /* Beam polar azimuth angle -180 to +180 degrees Q15.0 */
int16_t elevation; /* Beam polar elevation angle -90 to +90 degrees Q15.0 */
int16_t filter_index; /* Index of first filter for the filter bank for this beam angle */
int16_t reserved; /* For future */
} __attribute__((packed));

struct sof_tdfb_mic_location {
int16_t x; /* Microphone x coordinate as Q4.12 meters */
int16_t y; /* Microphone y coordinate as Q4.12 meters */
int16_t z; /* Microphone z coordinate as Q4.12 meters */
int16_t reserved; /* For future */
} __attribute__((packed));

#endif /* __USER_TDFB_H__ */
2 changes: 1 addition & 1 deletion tools/test/audio/tdfb_test.m
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ function tdfb_test()
function test_beampattern(cfg, config_fn, simcap_fn);

fn = fullfile(cfg.tunepath, config_fn);
if isfile(fn)
if exist(fn, 'file')
load(fn);
else
fprintf(1, 'Array configuration file %s does not exist.\n', config_fn);
Expand Down
54 changes: 39 additions & 15 deletions tools/testbench/topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,21 @@ int load_asrc(void *dev, int comp_id, int pipeline_id,
return ret;
}

static int process_init_data(struct sof_ipc_comp_process **process_ipc,
struct sof_ipc_comp_process *process)
{
*process_ipc = malloc(sizeof(struct sof_ipc_comp_process));
if (!(*process_ipc)) {
fprintf(stderr, "error: Failed to allocate IPC\n");
return -errno;
}

/* Copy header */
memcpy(*process_ipc, process, sizeof(struct sof_ipc_comp_process));
(*process_ipc)->size = 0;
return 0;
}

static int process_append_data(struct sof_ipc_comp_process **process_ipc,
struct sof_ipc_comp_process *process,
struct snd_soc_tplg_ctl_hdr *ctl,
Expand All @@ -585,6 +600,11 @@ static int process_append_data(struct sof_ipc_comp_process **process_ipc,
int size = 0;
struct snd_soc_tplg_bytes_control *bytes_ctl;

if (*process_ipc) {
fprintf(stderr, "error: Only single private data append to IPC is supported\n");
return -EINVAL;
}

/* Size is process IPC plus private data minus ABI header */
ipc_size = sizeof(struct sof_ipc_comp_process);
if (ctl->ops.info == SND_SOC_TPLG_CTL_BYTES) {
Expand Down Expand Up @@ -614,7 +634,7 @@ int load_process(void *dev, int comp_id, int pipeline_id,
{
struct sof *sof = (struct sof *)dev;
struct sof_ipc_comp_process process = {0};
struct sof_ipc_comp_process *process_ipc;
struct sof_ipc_comp_process *process_ipc = NULL;
struct snd_soc_tplg_ctl_hdr *ctl = NULL;
struct sof_ipc_comp_ext comp_ext;
char *priv_data = NULL;
Expand All @@ -632,28 +652,32 @@ int load_process(void *dev, int comp_id, int pipeline_id,
printf("%u ", comp_ext.uuid[i]);
printf("\n");

/* Only one control is supported*/
if (widget->num_kcontrols > 1) {
fprintf(stderr, "error: more than one kcontrol defined\n");
return -EINVAL;
}

/* Get control into ctl and priv_data */
if (widget->num_kcontrols) {
for (i = 0; i < widget->num_kcontrols; i++) {
ret = tplg_load_one_control(&ctl, &priv_data, file);
if (ret < 0) {
fprintf(stderr, "error: failed control load\n");
return ret;
}

/* Merge process and priv_data into process_ipc */
if (priv_data)
ret = process_append_data(&process_ipc, &process, ctl, priv_data);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unless priv_data is only allocated for one of controls, i.e. if there's one and only one SND_SOC_TPLG_CTL_BYTES control, you'll be overwriting process_ipc here and leaking memory? And below you're using process_ipc from the last iteration? Can .num_kcontrols be 0, then you'd be dereferencing NULL below?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! I recall I had earlier problem here with multiple same type controls. Then tplg was changed into three different control types and I forgot about it. This this likely hits again, need to test.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lyakh I've hopefully now addressed your findings. As limitation this code can handle only one control private data append to new() IPC. A proper solution would need similar only cmd() based control passing to firmware. I feel it's too large task to do withing beamformer update and needs a separate PR.

This handler seems to work OK for testbench usage with the 5 controls presented in topology for the TDFB component.


free(ctl);
free(priv_data);
if (ret) {
fprintf(stderr, "error: private data append failed\n");
free(process_ipc);
return ret;
}
}

/* Merge process and priv_data into process_ipc */
ret = process_append_data(&process_ipc, &process, ctl, priv_data);
free(ctl);
free(priv_data);
if (ret) {
fprintf(stderr, "error: private data append failed\n");
return ret;
/* Default IPC without appended data */
if (!process_ipc) {
ret = process_init_data(&process_ipc, &process);
if (ret)
return ret;
}

/* load process component */
Expand Down
7 changes: 5 additions & 2 deletions tools/topology/topology1/development/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ set(TPLGS
"sof-cml-rt1011-rt5682-nokwd\;sof-cml-rt1011-rt5682-nokwd\;-DCHANNELS=2\;-DDMICPROC_FILTER1=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER1=eq_iir_coef_highpass_40hz_20db_16khz.m4"
"sof-cml-rt1011-rt5682-nokwd\;sof-cml-rt1011-rt5682-eq\;-DCHANNELS=2\;-DDMICPROC_FILTER1=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER1=eq_iir_coef_highpass_40hz_20db_16khz.m4\;-DHSEARPROC=eq-iir-eq-fir-volume\;-DHSMICPROC=eq-fir-volume\;-DSPKPROC=eq-iir-eq-fir-volume"
"sof-cml-rt1011-rt5682-nokwd\;sof-cml-rt1011-rt5682-asrc\;-DCHANNELS=2\;-DDMICPROC_FILTER1=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER1=eq_iir_coef_highpass_40hz_20db_16khz.m4\;-DHSEARPROC=asrc-volume\;-DHSMICPROC=asrc-volume\;-DSPKPROC=eq-iir-eq-fir-volume"
"sof-cml-rt1011-rt5682-nokwd\;sof-cml-rt1011-rt5682-tdfb_68mm_2ch\;-DCHANNELS=2\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line2_68mm_pm0_30_90deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line2_68mm_pm0_30_90deg_48khz.m4"
"sof-imx8mp-src-wm8960\;sof-imx8mp-src-wm8960"
"sof-imx8-src-wm8960\;sof-imx8-src-wm8960"
"sof-imx8-src-cs42888\;sof-imx8-src-cs42888"
Expand All @@ -26,13 +27,15 @@ set(TPLGS

# The topologies those are built from topology in the parent directory
set(TPLGS_UP
"sof-apl-pcm512x\;sof-apl-pcm512x-tdfb_28mm-4ch\;-DFSYNC=48000\;-DCHANNELS=4\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line4_28mm_pm10deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line4_28mm_pm10deg_48khz.m4"
"sof-apl-pcm512x\;sof-apl-pcm512x-tdfb_28mm-4ch\;-DFSYNC=48000\;-DCHANNELS=4\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line4_28mm_pm0_30_90deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line4_28mm_pm0_30_90deg_48khz.m4\;-DDMICPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_16khz.m4"
"sof-cml-rt1011-rt5682\;sof-cml-eq-rt1011-rt5682\;-DPLATFORM=cml\;-DPPROC=eq-iir-eq-fir-volume"
"sof-cml-rt5682\;sof-cml-eq-fir-loud-rt5682\;-DPLATFORM=cml\;-DHSEARPROC=eq-iir-volume\;-DPIPELINE_FILTER1=eq_iir_coef_loudness.m4\;-DHSMICPROC=eq-fir-volume\;-DPIPELINE_FILTER2=eq_fir_coef_loudness.m4\;-DDMICPROC=eq-iir-volume\;-DDMIC16KPROC=eq-iir-volume"
"sof-cml-rt5682\;sof-cml-eq-fir-rt5682\;-DPLATFORM=cml\;-DHSMICPROC=eq-fir-volume\;-DDMICPROC=eq-iir-volume\;-DDMIC16KPROC=eq-iir-volume"
"sof-cml-rt5682\;sof-cml-eq-iir-rt5682\;-DPLATFORM=cml\;-DHSEARPROC=eq-iir-volume\;-DDMICPROC=eq-iir-volume\;-DDMIC16KPROC=eq-iir-volume"
"sof-glk-da7219\;sof-glk-eq-da7219\;-DHEADPHONE=da7219\;-DDMICPROC=eq-iir-volume"
"sof-hda-generic\;sof-hda-generic-tdfb_50mm-2ch\;-DCHANNELS=2\;-DHSPROC=volume\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line2_50mm_pm10deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line2_50mm_pm10deg_48khz.m4\;-DDMICPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_16khz.m4"
"sof-hda-generic\;sof-hda-generic-tdfb_50mm-2ch\;-DCHANNELS=2\;-DHSPROC=volume\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line2_50mm_pm0_30_90deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line2_50mm_pm0_30_90deg_48khz.m4\;-DDMICPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_16khz.m4"
"sof-hda-generic\;sof-hda-generic-tdfb_68mm-2ch\;-DCHANNELS=2\;-DHSPROC=volume\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line2_68mm_pm0_30_90deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line2_68mm_pm0_30_90deg_48khz.m4\;-DDMICPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_16khz.m4"
"sof-hda-generic\;sof-hda-generic-tdfb_0mm36mm146mm182mm-4ch\;-DCHANNELS=2\;-DHSPROC=volume\;-DDMIC16KPROC=tdfb-eq-iir-volume\;-DDMIC16KPROC_FILTER1=tdfb/coef_line4_0mm36mm146mm182mm_pm0_30_90deg_16khz.m4\;-DDMICPROC=tdfb-eq-iir-volume\;-DDMICPROC_FILTER1=tdfb/coef_line4_0mm36mm146mm182mm_pm0_30deg_48khz.m4\;-DDMICPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_48khz.m4\;-DDMIC16KPROC_FILTER2=eq_iir_coef_highpass_40hz_20db_16khz.m4"
)

add_custom_target(dev_topologies1 ALL)
Expand Down
17 changes: 17 additions & 0 deletions tools/topology/topology1/m4/enumcontrol.m4
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,20 @@ define(`C_CONTROLENUM',
` # control uses bespoke driver get/put/info ID for io ops'
` $5'
`}')

dnl C_CONTROLENUM(name, index, ops, ops, enums)
define(`C_CONTROLENUM',
`SectionControlEnum.STR($1) {'
`'
` # control belongs to this index group'
` index STR($2)'
`'
` # enum values as text'
` texts STR($3)'
`'
` # channel register and shift for Front Left/Right'
` $4'
`'
` # control uses bespoke driver get/put/info ID for io ops'
` $5'
`}')
10 changes: 9 additions & 1 deletion tools/topology/topology1/m4/tdfb.m4
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,16 @@ define(`W_TDFB',
` "'N_TDFB($1)`_data_str"'
` "'N_TDFB($1)`_data_str_type"'
` ]'
` bytes ['
` mixer ['
$6
$7
` ]'
` enum ['
$8
$9
` ]'
` bytes ['
$10
` ]'
`}')

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Exported EQ 10-Sep-2020
# Exported EQ 06-Jul-2021
CONTROLBYTES_PRIV(DEF_TDFB_PRIV,
` bytes "0x53,0x4f,0x46,0x00,0x00,0x00,0x00,0x00,'
` 0x50,0x01,0x00,0x00,0x00,0x00,0x01,0x03,'
` 0xa4,0x01,0x00,0x00,0x01,0x20,0x01,0x03,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x50,0x01,0x00,0x00,0x02,0x00,0x02,0x00,'
` 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0xa4,0x01,0x00,0x00,0x02,0x00,0x02,0x00,'
` 0x01,0x00,0x00,0x00,0x02,0x00,0x01,0x00,'
` 0x01,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
Expand Down Expand Up @@ -44,6 +44,17 @@ CONTROLBYTES_PRIV(DEF_TDFB_PRIV,
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x04,0x00,0xff,0xff,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x04,0x00,0xff,0xff,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,'
` 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00"'
` 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,'
` 0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0xff,'
` 0x00,0x00,0x00,0x00"'
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Exported EQ 10-Sep-2020
# Exported EQ 06-Jul-2021
CONTROLBYTES_PRIV(DEF_TDFB_PRIV,
` bytes "0x53,0x4f,0x46,0x00,0x00,0x00,0x00,0x00,'
` 0x50,0x01,0x00,0x00,0x00,0x00,0x01,0x03,'
` 0xa4,0x01,0x00,0x00,0x01,0x20,0x01,0x03,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x50,0x01,0x00,0x00,0x02,0x00,0x02,0x00,'
` 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0xa4,0x01,0x00,0x00,0x02,0x00,0x02,0x00,'
` 0x01,0x00,0x00,0x00,0x02,0x00,0x01,0x00,'
` 0x01,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
Expand Down Expand Up @@ -44,6 +44,17 @@ CONTROLBYTES_PRIV(DEF_TDFB_PRIV,
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x04,0x00,0xff,0xff,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x04,0x00,0xff,0xff,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,'
` 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00"'
` 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,'
` 0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x00,'
` 0x00,0x00,0x00,0x00,0x00,0x00,0x9a,0xff,'
` 0x00,0x00,0x00,0x00"'
)

This file was deleted.

Loading