This library controls a ST TDA7419 audio control IC. This is part of a project to implement an mbed controlled car stereo. The TDA7419 will take in stereo and output four channels of audio plus a subwoofer channel.

Dependents:   car_stereo

Committer:
danielashercohen
Date:
Sun Oct 26 22:49:34 2014 +0000
Revision:
2:34a58356394c
Parent:
1:69c37f1ab7df
Basic tone control features all implemented,  working with FRDM-KL25Z

Who changed what in which revision?

UserRevisionLine numberNew contents of line
danielashercohen 0:86ea14016b10 1 /** PreampTDA7419 Library
danielashercohen 0:86ea14016b10 2 *
danielashercohen 0:86ea14016b10 3 * @Author: Dan Cohen
danielashercohen 2:34a58356394c 4 *
danielashercohen 0:86ea14016b10 5 */
danielashercohen 2:34a58356394c 6
danielashercohen 0:86ea14016b10 7 #include "mbed.h"
danielashercohen 0:86ea14016b10 8 #include "PreampTDA7419.h"
danielashercohen 0:86ea14016b10 9 #include <stdio.h>
danielashercohen 0:86ea14016b10 10 #include <string.h>
danielashercohen 0:86ea14016b10 11
danielashercohen 0:86ea14016b10 12 PreampTDA7419::PreampTDA7419(PinName sda, PinName scl):
danielashercohen 0:86ea14016b10 13 _device(sda, scl)
danielashercohen 0:86ea14016b10 14 {
danielashercohen 1:69c37f1ab7df 15 _volume = 6;
danielashercohen 1:69c37f1ab7df 16 _input = 1;
danielashercohen 1:69c37f1ab7df 17
danielashercohen 1:69c37f1ab7df 18 _mute = 0;
danielashercohen 1:69c37f1ab7df 19 _mix = 0;
danielashercohen 1:69c37f1ab7df 20
danielashercohen 1:69c37f1ab7df 21 // for register 4 Treble Filter
danielashercohen 1:69c37f1ab7df 22 _referenceInE = 0;
danielashercohen 1:69c37f1ab7df 23 _trebleCenterFreq = 0;
danielashercohen 1:69c37f1ab7df 24 _treble = 0;
danielashercohen 1:69c37f1ab7df 25
danielashercohen 1:69c37f1ab7df 26 // for middle frequecy filter
danielashercohen 1:69c37f1ab7df 27 _middleSoftStep = 0;
danielashercohen 1:69c37f1ab7df 28 _middleQ = 0;
danielashercohen 1:69c37f1ab7df 29 _middle = 0;
danielashercohen 2:34a58356394c 30
danielashercohen 2:34a58356394c 31 _atten_lf = 9;
danielashercohen 2:34a58356394c 32 _atten_rf = 9;
danielashercohen 2:34a58356394c 33 _atten_lr = 9;
danielashercohen 2:34a58356394c 34 _atten_rr = 9;
danielashercohen 2:34a58356394c 35 _atten_mix = 9;
danielashercohen 2:34a58356394c 36 _atten_sub = 9;
danielashercohen 2:34a58356394c 37
danielashercohen 0:86ea14016b10 38 }
danielashercohen 0:86ea14016b10 39
danielashercohen 2:34a58356394c 40 void PreampTDA7419::writeToTDA7419 (int command, int value)
danielashercohen 2:34a58356394c 41 {
danielashercohen 2:34a58356394c 42 int transmissionSuccessful;
danielashercohen 2:34a58356394c 43 _device.start();
danielashercohen 2:34a58356394c 44 transmissionSuccessful = _device.write(TDA7419_ADDRESS<<1);
danielashercohen 2:34a58356394c 45 transmissionSuccessful |= _device.write(command);
danielashercohen 2:34a58356394c 46 transmissionSuccessful |= _device.write(value);
danielashercohen 2:34a58356394c 47 _device.stop();
danielashercohen 2:34a58356394c 48 // return (transmissionSuccessful);
danielashercohen 2:34a58356394c 49 }
danielashercohen 1:69c37f1ab7df 50
danielashercohen 1:69c37f1ab7df 51 /////////////////////////////////
danielashercohen 1:69c37f1ab7df 52 // set the speaker attenuators //
danielashercohen 1:69c37f1ab7df 53 /////////////////////////////////
danielashercohen 2:34a58356394c 54 // attenuation can be set from 0 to 11 and this is mapped to the
danielashercohen 1:69c37f1ab7df 55 // values that the TDA7419 uses for it's attenuation (0->h60)
danielashercohen 1:69c37f1ab7df 56
danielashercohen 1:69c37f1ab7df 57 //
danielashercohen 1:69c37f1ab7df 58 // (FL/FR/RL/RR/SWL/SWR) (13-18)
danielashercohen 2:34a58356394c 59 void PreampTDA7419::setAttenuationReg(int regAddr, int attenuation)
danielashercohen 2:34a58356394c 60 {
danielashercohen 2:34a58356394c 61 int regAtten;
danielashercohen 2:34a58356394c 62 if (attenuation == 11) {
danielashercohen 2:34a58356394c 63 regAtten = 13;
danielashercohen 2:34a58356394c 64 } else if (attenuation == 10) {
danielashercohen 2:34a58356394c 65 regAtten = 6;
danielashercohen 2:34a58356394c 66 } else {
danielashercohen 2:34a58356394c 67 regAtten = (99-(attenuation*9));
danielashercohen 2:34a58356394c 68 }
danielashercohen 2:34a58356394c 69 writeToTDA7419(regAddr, regAtten);
danielashercohen 1:69c37f1ab7df 70 }
danielashercohen 1:69c37f1ab7df 71
danielashercohen 2:34a58356394c 72 int PreampTDA7419::calcToneAttenuationReg(int attenuation)
danielashercohen 2:34a58356394c 73 {
danielashercohen 2:34a58356394c 74 int regAtten;
danielashercohen 2:34a58356394c 75 if (attenuation > 0) {
danielashercohen 2:34a58356394c 76 regAtten = 16 + (attenuation * 3);
danielashercohen 2:34a58356394c 77 } else if (attenuation == 0) {
danielashercohen 2:34a58356394c 78 regAtten = 0;
danielashercohen 2:34a58356394c 79 } else if (attenuation < 0) {
danielashercohen 2:34a58356394c 80 regAtten = 0 - (attenuation * 3);
danielashercohen 2:34a58356394c 81 }
danielashercohen 2:34a58356394c 82 return (regAtten);
danielashercohen 1:69c37f1ab7df 83 }
danielashercohen 1:69c37f1ab7df 84
danielashercohen 1:69c37f1ab7df 85 // update all of the registers in the TDA7419
danielashercohen 2:34a58356394c 86 void PreampTDA7419::updateTDA7419Reg()
danielashercohen 2:34a58356394c 87 {
danielashercohen 2:34a58356394c 88
danielashercohen 1:69c37f1ab7df 89 int s_main_source = 0;
danielashercohen 1:69c37f1ab7df 90 int s_main_loud = 1 | 0x40;
danielashercohen 1:69c37f1ab7df 91 int s_softmute = 2 | 0x40;
danielashercohen 1:69c37f1ab7df 92 int s_volume = 3 | 0x40;
danielashercohen 1:69c37f1ab7df 93 int s_treble = 4 | 0x40;
danielashercohen 1:69c37f1ab7df 94 int s_middle = 5 | 0x40;
danielashercohen 1:69c37f1ab7df 95 int s_bass = 6 | 0x40;
danielashercohen 1:69c37f1ab7df 96 int s_second_source = 7 | 0x40;
danielashercohen 1:69c37f1ab7df 97 int s_sub_mid_bass = 8 | 0x40;
danielashercohen 1:69c37f1ab7df 98 int s_mix_gain = 9 | 0x40;
danielashercohen 1:69c37f1ab7df 99 int s_atten_lf = 10 | 0x40;
danielashercohen 1:69c37f1ab7df 100 int s_atten_rf = 11 | 0x40;
danielashercohen 1:69c37f1ab7df 101 int s_atten_lr = 12 | 0x40;
danielashercohen 1:69c37f1ab7df 102 int s_atten_rr = 13 | 0x40;
danielashercohen 1:69c37f1ab7df 103 int s_atten_mix = 14 | 0x40;
danielashercohen 1:69c37f1ab7df 104 int s_atten_sub = 15 | 0x40;
danielashercohen 1:69c37f1ab7df 105 int s_spectrum = 16 | 0x40;
danielashercohen 2:34a58356394c 106 // int s_test = 17 | 0x40;
danielashercohen 2:34a58356394c 107
danielashercohen 2:34a58356394c 108 //////////////////////////////////////////////////////////////////
danielashercohen 2:34a58356394c 109 // Calculate actual register values from the variables that the //
danielashercohen 2:34a58356394c 110 // buttons control //
danielashercohen 2:34a58356394c 111 //////////////////////////////////////////////////////////////////
danielashercohen 1:69c37f1ab7df 112
danielashercohen 2:34a58356394c 113 //////////////////////////
danielashercohen 2:34a58356394c 114 // update the registers //
danielashercohen 2:34a58356394c 115 //////////////////////////
danielashercohen 2:34a58356394c 116 writeToTDA7419(s_main_source, ( (0x78) | (_input & 0x3) ) );
danielashercohen 2:34a58356394c 117 writeToTDA7419(s_main_loud, (0xc0));
danielashercohen 2:34a58356394c 118 writeToTDA7419(s_softmute, (0xa7));
danielashercohen 2:34a58356394c 119 setAttenuationReg(s_volume, _volume);
danielashercohen 1:69c37f1ab7df 120
danielashercohen 1:69c37f1ab7df 121
danielashercohen 2:34a58356394c 122 // tone register attenuation isn't simple so moving that
danielashercohen 2:34a58356394c 123 // calculation to a separate function
danielashercohen 2:34a58356394c 124 // locking softwtep as '0' because that is on and I think we
danielashercohen 2:34a58356394c 125 // want soft step!
danielashercohen 2:34a58356394c 126 writeToTDA7419(s_treble,
danielashercohen 2:34a58356394c 127 ( (0 & 0x1 ) << 7 ) |
danielashercohen 2:34a58356394c 128 ( (1 & 0x3 ) << 5 ) |
danielashercohen 2:34a58356394c 129 ( (calcToneAttenuationReg(_treble) & 0x1f ) ) );
danielashercohen 1:69c37f1ab7df 130
danielashercohen 2:34a58356394c 131 writeToTDA7419(s_middle,
danielashercohen 2:34a58356394c 132 ( (0 & 0x1 ) << 7 ) |
danielashercohen 2:34a58356394c 133 ( (1 & 0x3 ) << 5 ) |
danielashercohen 2:34a58356394c 134 ( (calcToneAttenuationReg(_middle) & 0x1f ) ) );
danielashercohen 1:69c37f1ab7df 135
danielashercohen 2:34a58356394c 136 writeToTDA7419(s_bass,
danielashercohen 2:34a58356394c 137 ( (0 & 0x1 ) << 7 ) |
danielashercohen 2:34a58356394c 138 ( (1 & 0x3 ) << 5 ) |
danielashercohen 2:34a58356394c 139 ( (calcToneAttenuationReg(_bass) & 0x1f ) ) );
danielashercohen 2:34a58356394c 140
danielashercohen 1:69c37f1ab7df 141
danielashercohen 2:34a58356394c 142 // this register allows the second source to be routed to the rear speakers
danielashercohen 2:34a58356394c 143 // not useful in the context of this project
danielashercohen 2:34a58356394c 144 writeToTDA7419(s_second_source, (0x07));
danielashercohen 1:69c37f1ab7df 145
danielashercohen 2:34a58356394c 146 // this is the subwoofer cut-off frequency
danielashercohen 2:34a58356394c 147 // 11 which is 160Khz)
danielashercohen 2:34a58356394c 148 writeToTDA7419(s_sub_mid_bass, (0x63));
danielashercohen 1:69c37f1ab7df 149
danielashercohen 2:34a58356394c 150 // mix to the front speakers, enable the sub, no gain
danielashercohen 2:34a58356394c 151 if (_mix == 1) {
danielashercohen 2:34a58356394c 152 writeToTDA7419(s_mix_gain, (0xf7));
danielashercohen 2:34a58356394c 153 } else {
danielashercohen 2:34a58356394c 154 writeToTDA7419(s_mix_gain, (0xf0));
danielashercohen 2:34a58356394c 155 }
danielashercohen 1:69c37f1ab7df 156
danielashercohen 2:34a58356394c 157 setAttenuationReg(s_atten_lf , _atten_lf );
danielashercohen 2:34a58356394c 158 setAttenuationReg(s_atten_rf , _atten_rf );
danielashercohen 2:34a58356394c 159 setAttenuationReg(s_atten_lr , _atten_lr );
danielashercohen 2:34a58356394c 160 setAttenuationReg(s_atten_rr , _atten_rr );
danielashercohen 1:69c37f1ab7df 161
danielashercohen 2:34a58356394c 162 setAttenuationReg(s_atten_mix , _atten_mix );
danielashercohen 2:34a58356394c 163 setAttenuationReg(s_atten_sub , _atten_sub );
danielashercohen 1:69c37f1ab7df 164
danielashercohen 2:34a58356394c 165 writeToTDA7419 (s_spectrum, (0x09));
danielashercohen 1:69c37f1ab7df 166
danielashercohen 1:69c37f1ab7df 167 }
danielashercohen 1:69c37f1ab7df 168
danielashercohen 2:34a58356394c 169 /* setVolume: This sets the volume within the valid range of 0->11
danielashercohen 1:69c37f1ab7df 170 return indicates it was successfully set */
danielashercohen 2:34a58356394c 171 void PreampTDA7419::setVolume(int volume)
danielashercohen 2:34a58356394c 172 {
danielashercohen 2:34a58356394c 173 if (volume > 11) {
danielashercohen 2:34a58356394c 174 _volume = 11;
danielashercohen 2:34a58356394c 175 } else if (volume < 0) {
danielashercohen 2:34a58356394c 176 volume = 0;
danielashercohen 2:34a58356394c 177 } else {
danielashercohen 2:34a58356394c 178 _volume = volume;
danielashercohen 2:34a58356394c 179 }
danielashercohen 2:34a58356394c 180 updateTDA7419Reg();
danielashercohen 1:69c37f1ab7df 181 }
danielashercohen 1:69c37f1ab7df 182
danielashercohen 1:69c37f1ab7df 183 /* readVolume: return the volume level that is currently set */
danielashercohen 2:34a58356394c 184 int PreampTDA7419::readVolume()
danielashercohen 2:34a58356394c 185 {
danielashercohen 2:34a58356394c 186 return (_volume);
danielashercohen 2:34a58356394c 187 }
danielashercohen 2:34a58356394c 188 /* readVolume: return the volume level that is currently set */
danielashercohen 2:34a58356394c 189 int PreampTDA7419::increaseVolume()
danielashercohen 2:34a58356394c 190 {
danielashercohen 2:34a58356394c 191 _volume++;
danielashercohen 2:34a58356394c 192 setVolume(_volume);
danielashercohen 2:34a58356394c 193 return (_volume);
danielashercohen 1:69c37f1ab7df 194 }
danielashercohen 1:69c37f1ab7df 195 /* readVolume: return the volume level that is currently set */
danielashercohen 2:34a58356394c 196 int PreampTDA7419::decreaseVolume()
danielashercohen 2:34a58356394c 197 {
danielashercohen 2:34a58356394c 198 _volume--;
danielashercohen 2:34a58356394c 199 setVolume(_volume);
danielashercohen 2:34a58356394c 200 return (_volume);
danielashercohen 2:34a58356394c 201 }
danielashercohen 2:34a58356394c 202
danielashercohen 2:34a58356394c 203 void PreampTDA7419::setInput(int input)
danielashercohen 2:34a58356394c 204 {
danielashercohen 2:34a58356394c 205 if (input > 3) {
danielashercohen 2:34a58356394c 206 _input = 3;
danielashercohen 2:34a58356394c 207 } else if (input < 0) {
danielashercohen 2:34a58356394c 208 input = 0;
danielashercohen 2:34a58356394c 209 } else {
danielashercohen 2:34a58356394c 210 _input = input;
danielashercohen 2:34a58356394c 211 }
danielashercohen 2:34a58356394c 212 updateTDA7419Reg();
danielashercohen 2:34a58356394c 213 }
danielashercohen 2:34a58356394c 214
danielashercohen 2:34a58356394c 215 int PreampTDA7419::readInput()
danielashercohen 2:34a58356394c 216 {
danielashercohen 2:34a58356394c 217 return (_input);
danielashercohen 1:69c37f1ab7df 218 }
danielashercohen 2:34a58356394c 219
danielashercohen 2:34a58356394c 220 int PreampTDA7419::increaseTreble()
danielashercohen 2:34a58356394c 221 {
danielashercohen 2:34a58356394c 222 if (_treble < 5) {
danielashercohen 2:34a58356394c 223 _treble++;
danielashercohen 2:34a58356394c 224 }
danielashercohen 2:34a58356394c 225 updateTDA7419Reg();
danielashercohen 2:34a58356394c 226 return(_treble);
danielashercohen 2:34a58356394c 227 }
danielashercohen 2:34a58356394c 228
danielashercohen 2:34a58356394c 229 int PreampTDA7419::decreaseTreble()
danielashercohen 2:34a58356394c 230 {
danielashercohen 2:34a58356394c 231 if (_treble > -5) {
danielashercohen 2:34a58356394c 232 _treble--;
danielashercohen 2:34a58356394c 233 }
danielashercohen 2:34a58356394c 234 updateTDA7419Reg();
danielashercohen 2:34a58356394c 235 return(_treble);
danielashercohen 2:34a58356394c 236 }
danielashercohen 2:34a58356394c 237
danielashercohen 2:34a58356394c 238 int PreampTDA7419::readTreble()
danielashercohen 2:34a58356394c 239 {
danielashercohen 2:34a58356394c 240 return (_treble);
danielashercohen 2:34a58356394c 241 }
danielashercohen 2:34a58356394c 242
danielashercohen 2:34a58356394c 243 int PreampTDA7419::increaseMiddle()
danielashercohen 2:34a58356394c 244 {
danielashercohen 2:34a58356394c 245 if (_middle < 5) {
danielashercohen 2:34a58356394c 246 _middle++;
danielashercohen 2:34a58356394c 247 }
danielashercohen 2:34a58356394c 248 updateTDA7419Reg();
danielashercohen 2:34a58356394c 249 return(_middle);
danielashercohen 1:69c37f1ab7df 250 }
danielashercohen 1:69c37f1ab7df 251
danielashercohen 2:34a58356394c 252 int PreampTDA7419::decreaseMiddle()
danielashercohen 2:34a58356394c 253 {
danielashercohen 2:34a58356394c 254 if (_middle > -5) {
danielashercohen 2:34a58356394c 255 _middle--;
danielashercohen 2:34a58356394c 256 }
danielashercohen 2:34a58356394c 257 updateTDA7419Reg();
danielashercohen 2:34a58356394c 258 return(_middle);
danielashercohen 2:34a58356394c 259 }
danielashercohen 2:34a58356394c 260
danielashercohen 2:34a58356394c 261 int PreampTDA7419::readMiddle()
danielashercohen 2:34a58356394c 262 {
danielashercohen 2:34a58356394c 263 return (_middle);
danielashercohen 1:69c37f1ab7df 264 }
danielashercohen 1:69c37f1ab7df 265
danielashercohen 2:34a58356394c 266 int PreampTDA7419::increaseBass()
danielashercohen 2:34a58356394c 267 {
danielashercohen 2:34a58356394c 268 if (_bass < 5) {
danielashercohen 2:34a58356394c 269 _bass++;
danielashercohen 2:34a58356394c 270 }
danielashercohen 2:34a58356394c 271 updateTDA7419Reg();
danielashercohen 2:34a58356394c 272 return(_bass);
danielashercohen 2:34a58356394c 273 }
danielashercohen 2:34a58356394c 274
danielashercohen 2:34a58356394c 275 int PreampTDA7419::decreaseBass()
danielashercohen 2:34a58356394c 276 {
danielashercohen 2:34a58356394c 277 if (_bass > -5) {
danielashercohen 2:34a58356394c 278 _bass--;
danielashercohen 2:34a58356394c 279 }
danielashercohen 2:34a58356394c 280 updateTDA7419Reg();
danielashercohen 2:34a58356394c 281 return(_bass);
danielashercohen 2:34a58356394c 282 }
danielashercohen 2:34a58356394c 283
danielashercohen 2:34a58356394c 284 int PreampTDA7419::readBass()
danielashercohen 2:34a58356394c 285 {
danielashercohen 2:34a58356394c 286 return (_bass);
danielashercohen 1:69c37f1ab7df 287 }
danielashercohen 1:69c37f1ab7df 288
danielashercohen 2:34a58356394c 289 int PreampTDA7419::increaseSpeaker (int speakerNumber) {
danielashercohen 2:34a58356394c 290 switch (speakerNumber) {
danielashercohen 2:34a58356394c 291 case (1): if (_atten_lf < 11) { _atten_lf++; }; updateTDA7419Reg(); return( _atten_lf );
danielashercohen 2:34a58356394c 292 case (2): if (_atten_rf < 11) { _atten_rf++; }; updateTDA7419Reg(); return( _atten_rf );
danielashercohen 2:34a58356394c 293 case (3): if (_atten_lr < 11) { _atten_lr++; }; updateTDA7419Reg(); return( _atten_lr );
danielashercohen 2:34a58356394c 294 case (4): if (_atten_rr < 11) { _atten_rr++; }; updateTDA7419Reg(); return( _atten_rr );
danielashercohen 2:34a58356394c 295 case (5): if (_atten_sub < 11) { _atten_sub++; }; updateTDA7419Reg(); return( _atten_sub );
danielashercohen 2:34a58356394c 296 case (6): if (_atten_mix < 11) { _atten_mix++; }; updateTDA7419Reg(); return( _atten_mix );
danielashercohen 1:69c37f1ab7df 297 }
danielashercohen 2:34a58356394c 298 return (_atten_lf );
danielashercohen 1:69c37f1ab7df 299 }
danielashercohen 1:69c37f1ab7df 300
danielashercohen 2:34a58356394c 301 int PreampTDA7419::decreaseSpeaker (int speakerNumber) {
danielashercohen 2:34a58356394c 302 switch (speakerNumber) {
danielashercohen 2:34a58356394c 303 case (1): if (_atten_lf > 0) { _atten_lf--; }; updateTDA7419Reg(); return( _atten_lf );
danielashercohen 2:34a58356394c 304 case (2): if (_atten_rf > 0) { _atten_rf--; }; updateTDA7419Reg(); return( _atten_rf );
danielashercohen 2:34a58356394c 305 case (3): if (_atten_lr > 0) { _atten_lr--; }; updateTDA7419Reg(); return( _atten_lr );
danielashercohen 2:34a58356394c 306 case (4): if (_atten_rr > 0) { _atten_rr--; }; updateTDA7419Reg(); return( _atten_rr );
danielashercohen 2:34a58356394c 307 case (5): if (_atten_sub > 0) { _atten_sub--; }; updateTDA7419Reg(); return( _atten_sub );
danielashercohen 2:34a58356394c 308 case (6): if (_atten_mix > 0) { _atten_mix--; }; updateTDA7419Reg(); return( _atten_mix );
danielashercohen 2:34a58356394c 309 }
danielashercohen 2:34a58356394c 310 return (_atten_lf );
danielashercohen 2:34a58356394c 311 }
danielashercohen 1:69c37f1ab7df 312
danielashercohen 2:34a58356394c 313 int PreampTDA7419::readSpeaker (int speakerNumber) {
danielashercohen 2:34a58356394c 314 switch (speakerNumber) {
danielashercohen 2:34a58356394c 315 case (1): return( _atten_lf );
danielashercohen 2:34a58356394c 316 case (2): return( _atten_rf );
danielashercohen 2:34a58356394c 317 case (3): return( _atten_lr );
danielashercohen 2:34a58356394c 318 case (4): return( _atten_rr );
danielashercohen 2:34a58356394c 319 case (5): return( _atten_sub );
danielashercohen 2:34a58356394c 320 case (6): return( _atten_mix );
danielashercohen 2:34a58356394c 321 }
danielashercohen 2:34a58356394c 322 return (_atten_lf );
danielashercohen 2:34a58356394c 323 }
danielashercohen 2:34a58356394c 324
danielashercohen 2:34a58356394c 325 int PreampTDA7419::toggleMix() {
danielashercohen 2:34a58356394c 326 _mix = !_mix;
danielashercohen 2:34a58356394c 327 updateTDA7419Reg();
danielashercohen 2:34a58356394c 328 return (_mix);
danielashercohen 2:34a58356394c 329 }
danielashercohen 2:34a58356394c 330
danielashercohen 2:34a58356394c 331 int PreampTDA7419::readMix() {
danielashercohen 2:34a58356394c 332 return (_mix);
danielashercohen 2:34a58356394c 333 }