Changeset 1627
- Timestamp:
- 08/21/09 23:55:43 (14 years ago)
- Files:
-
- trunk/libffado/src/rme/fireface_hw.cpp (modified) (2 diffs)
- trunk/libffado/src/rme/rme_avdevice.cpp (modified) (4 diffs)
- trunk/libffado/src/rme/rme_avdevice.h (modified) (2 diffs)
- trunk/libffado/src/rme/rme_shm.cpp (modified) (7 diffs)
- trunk/libffado/src/rme/rme_shm.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/rme/fireface_hw.cpp
r1624 r1627 51 51 // device flash and adopt that. For now (for initial testing purposes) 52 52 // we'll go with a static state. 53 memset(settings, 0, sizeof(*settings)); 54 settings->spdif_input_mode = FF_SWPARAM_SPDIF_INPUT_COAX; 55 settings->spdif_output_mode = FF_SWPARAM_SPDIF_OUTPUT_COAX; 56 settings->clock_mode = FF_SWPARAM_CLOCK_MODE_MASTER; 57 settings->sync_ref = FF_SWPARAM_SYNCREF_WORDCLOCK; 58 settings->input_level = FF_SWPARAM_ILEVEL_LOGAIN; 59 settings->output_level = FF_SWPARAM_OLEVEL_HIGAIN; 60 settings->phones_level = FF_SWPARAM_PHONESLEVEL_HIGAIN; 61 62 // Set amplifier gains 63 if (m_rme_model == RME_MODEL_FIREFACE400) { 64 signed int i; 65 for (i=0; i<FF400_AMPGAIN_NUM; i++) { 66 set_hardware_ampgain(i, settings->amp_gains[i]); 53 if (shared_data==NULL || shared_data->settings_valid==0) { 54 memset(settings, 0, sizeof(*settings)); 55 settings->spdif_input_mode = FF_SWPARAM_SPDIF_INPUT_COAX; 56 settings->spdif_output_mode = FF_SWPARAM_SPDIF_OUTPUT_COAX; 57 settings->clock_mode = FF_SWPARAM_CLOCK_MODE_MASTER; 58 settings->sync_ref = FF_SWPARAM_SYNCREF_WORDCLOCK; 59 settings->input_level = FF_SWPARAM_ILEVEL_LOGAIN; 60 settings->output_level = FF_SWPARAM_OLEVEL_HIGAIN; 61 settings->phones_level = FF_SWPARAM_PHONESLEVEL_HIGAIN; 62 63 // Set amplifier gains 64 if (m_rme_model == RME_MODEL_FIREFACE400) { 65 signed int i; 66 for (i=0; i<FF400_AMPGAIN_NUM; i++) { 67 set_hardware_ampgain(i, settings->amp_gains[i]); 68 } 67 69 } 70 71 if (shared_data != NULL) 72 shared_data->settings_valid = 1; 68 73 } 69 74 … … 78 83 // Also configure the TCO (Time Code Option) settings for those devices 79 84 // which have a TCO. 80 if (tco_present) { 81 memset(tco_settings, 0, sizeof(*tco_settings)); 82 return write_tco_settings(tco_settings); 83 } 84 85 if (shared_data==NULL || shared_data->tco_settings_valid==0) { 86 if (tco_present) { 87 memset(tco_settings, 0, sizeof(*tco_settings)); 88 write_tco_settings(tco_settings); 89 } 90 if (shared_data != NULL) 91 shared_data->tco_settings_valid = 1; 92 } 85 93 return 0; 86 94 } trunk/libffado/src/rme/rme_avdevice.cpp
r1624 r1627 94 94 debugOutput( DEBUG_LEVEL_VERBOSE, "Created Rme::Device (NodeID %d)\n", 95 95 getConfigRom().getNodeId() ); 96 97 settings = &settings_localobj;98 tco_settings = &tco_settings_localobj;99 100 memset(&settings, 0, sizeof(settings));101 memset(&tco_settings, 0, sizeof(tco_settings));102 96 } 103 97 … … 105 99 { 106 100 destroyMixer(); 101 102 if (shared_data != NULL) { 103 switch (rme_shm_close(shared_data)) { 104 case RSO_CLOSE: 105 debugOutput( DEBUG_LEVEL_VERBOSE, "Configuration shared data object closed\n"); 106 break; 107 case RSO_CLOSE_DELETE: 108 debugOutput( DEBUG_LEVEL_VERBOSE, "Configuration shared data object closed and deleted (no other users)\n"); 109 break; 110 } 111 } 107 112 } 108 113 … … 246 251 Device::discover() 247 252 { 253 signed int i; 248 254 unsigned int vendorId = getConfigRom().getNodeVendorId(); 249 255 // See note in Device::probe() about why we use the unit version here. … … 270 276 debugError("Unsupported model\n"); 271 277 return false; 278 } 279 280 // Set up the shared data object for configuration data 281 i = rme_shm_open(&shared_data); 282 if (i == RSO_OPEN_CREATED) { 283 debugOutput( DEBUG_LEVEL_VERBOSE, "New configuration shared data object created\n"); 284 } else 285 if (i == RSO_OPEN_ATTACHED) { 286 debugOutput( DEBUG_LEVEL_VERBOSE, "Attached to existing configuration shared data object\n"); 287 } 288 if (shared_data == NULL) { 289 debugOutput( DEBUG_LEVEL_WARNING, "Could not create/access shared configuration memory object, using process-local storage\n"); 290 settings = &settings_localobj; 291 tco_settings = &tco_settings_localobj; 292 memset(settings, 0, sizeof(*settings)); 293 memset(tco_settings, 0, sizeof(*tco_settings)); 294 } else { 295 settings = &shared_data->settings; 296 tco_settings = &shared_data->tco_settings; 272 297 } 273 298 trunk/libffado/src/rme/rme_avdevice.h
r1624 r1627 35 35 #include "fireface_def.h" 36 36 // #include "libstreaming/rme/RmeStreamProcessor.h" 37 38 #include "rme_shm.h" 37 39 38 40 class ConfigRom; … … 123 125 FF_TCO_settings_t *tco_settings; 124 126 127 rme_shm_t *shared_data; 125 128 FF_software_settings_t settings_localobj; 126 129 FF_TCO_settings_t tco_settings_localobj; trunk/libffado/src/rme/rme_shm.cpp
r1626 r1627 73 73 } 74 74 75 rme_shm_t *rme_shm_open(void) {75 signed int rme_shm_open(rme_shm_t **shm_data) { 76 76 77 77 signed int shmfd, lockfd; 78 78 rme_shm_t *data; 79 79 signed int created = 0; 80 81 if (shm_data == NULL) { 82 return RSO_ERROR; 83 } 84 *shm_data = NULL; 80 85 81 86 lockfd = rme_shm_lock(); … … 86 91 shmfd = shm_open(RME_SHM_NAME, O_RDWR | O_CREAT | O_EXCL, 0644); 87 92 if (shmfd < 0) 88 return NULL;93 return RSO_ERR_SHM; 89 94 else { 90 95 ftruncate(shmfd, RME_SHM_SIZE); … … 92 97 } 93 98 } else 94 return NULL;99 return RSO_ERR_SHM; 95 100 } 96 101 … … 99 104 100 105 if (data == MAP_FAILED) 101 return NULL;106 return RSO_ERR_MMAP; 102 107 103 108 if (created) { … … 107 112 pthread_mutex_lock(&data->lock); 108 113 data->ref_count++; 109 if (created)110 data->valid++;111 114 pthread_mutex_unlock(&data->lock); 112 115 113 116 rme_shm_unlock(lockfd); 114 117 115 return data; 118 *shm_data = data; 119 return created?RSO_OPEN_CREATED:RSO_OPEN_ATTACHED; 116 120 } 117 121 118 voidrme_shm_close(rme_shm_t *shm_data) {122 signed int rme_shm_close(rme_shm_t *shm_data) { 119 123 120 124 signed int unlink = 0; … … 125 129 pthread_mutex_lock(&shm_data->lock); 126 130 shm_data->ref_count--; 127 shm_data->valid = 0;128 131 unlink = (shm_data->ref_count == 0); 129 132 pthread_mutex_unlock(&shm_data->lock); … … 141 144 142 145 rme_shm_unlock(lockfd); 146 147 return unlink?RSO_CLOSE_DELETE:RSO_CLOSE; 143 148 } trunk/libffado/src/rme/rme_shm.h
r1624 r1627 33 33 typedef struct rme_shm_t { 34 34 signed int ref_count; 35 signed int valid;35 signed int settings_valid, tco_settings_valid; 36 36 FF_software_settings_t settings; 37 37 FF_TCO_settings_t tco_settings; … … 40 40 } rme_shm_t; 41 41 42 /* Return values from rme_shm_open(). RSO = Rme Shared Object. */ 43 #define RSO_ERR_MMAP -3 44 #define RSO_ERR_SHM -2 45 #define RSO_ERROR -1 46 #define RSO_OPEN_CREATED 0 47 #define RSO_OPEN_ATTACHED 1 48 49 /* Return values from rme_shm_close() */ 50 #define RSO_CLOSE 0 51 #define RSO_CLOSE_DELETE 1 52 42 53 /* Functions */ 43 54 44 rme_shm_t *rme_shm_open(void);45 voidrme_shm_close(rme_shm_t *shm_data);55 signed int rme_shm_open(rme_shm_t **shm_data); 56 signed int rme_shm_close(rme_shm_t *shm_data); 46 57 47 58 #endif