Changeset 302

Show
Ignore:
Timestamp:
09/14/06 19:56:03 (16 years ago)
Author:
jwoithe
Message:

jack driver: call detach() from finish() if detach() hasn't yet been called. This works around the fact that jack doesn't call detach() on close at this stage. Once this is fixed in jack the workaround can be removed.
C streaming API: set sample rate before device initialisation. This permits jackd to set the sample rate to that requested on the command line when starting jackd.
Motu device: start adding details to setSamplingFrequency() beyond that required for basic functionality.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libfreebob-2.0/src/libstreaming/freebob_streaming.cpp

    r269 r302  
    128128                IAvDevice *device=dev->m_deviceManager->getAvDeviceByIndex(i); 
    129129                assert(device); 
     130 
     131                // Set the device's sampling rate to that requested 
     132                // FIXME: does this really belong here?  If so we need to handle errors. 
     133                device->setSamplingFrequency(parseSampleRate(dev->options.sample_rate)); 
    130134 
    131135                // prepare the device 
  • branches/libfreebob-2.0/src/motu/motu_avdevice.cpp

    r296 r302  
    176176    int rate = 0; 
    177177 
    178     switch (q & MOTUFW_BASE_RATE_MASK) { 
    179         case MOTUFW_BASE_RATE_44100: 
     178    switch (q & MOTUFW_RATE_BASE_MASK) { 
     179        case MOTUFW_RATE_BASE_44100: 
    180180            rate = 44100; 
    181181            break; 
    182         case MOTUFW_BASE_RATE_48000: 
     182        case MOTUFW_RATE_BASE_48000: 
    183183            rate = 48000; 
    184184            break; 
     
    198198MotuDevice::setSamplingFrequency( ESamplingFrequency samplingFrequency ) 
    199199{ 
    200     /* 
    201      Implement the procedure to set the samplerate here 
    202     */ 
    203  
    204     quadlet_t new_rate=0; 
    205         int supported=true; 
    206  
    207     switch ( samplingFrequency ) { 
    208         case eSF_22050Hz: 
    209             supported=false; 
    210             break; 
    211         case eSF_24000Hz: 
    212             supported=false; 
    213             break; 
    214       case eSF_32000Hz: 
    215             supported=false; 
    216             break; 
    217         case eSF_44100Hz: 
    218             new_rate = MOTUFW_BASE_RATE_44100 | MOTUFW_RATE_MULTIPLIER_1X; 
    219             break; 
    220         case eSF_48000Hz: 
    221             new_rate = MOTUFW_BASE_RATE_48000 | MOTUFW_RATE_MULTIPLIER_1X; 
    222             break; 
    223         case eSF_88200Hz: 
    224             new_rate = MOTUFW_BASE_RATE_44100 | MOTUFW_RATE_MULTIPLIER_2X; 
    225             break; 
    226         case eSF_96000Hz: 
    227             new_rate = MOTUFW_BASE_RATE_48000 | MOTUFW_RATE_MULTIPLIER_2X; 
    228             break; 
    229         case eSF_176400Hz: 
    230             new_rate = MOTUFW_BASE_RATE_44100 | MOTUFW_RATE_MULTIPLIER_4X; 
    231             break; 
    232         case eSF_192000Hz: 
    233             new_rate = MOTUFW_BASE_RATE_48000 | MOTUFW_RATE_MULTIPLIER_4X; 
    234             break; 
    235         default: 
    236             supported=false; 
    237    
    238  
    239     // update the register.  FIXME: there's more to it than this 
    240     if (supported) { 
    241         quadlet_t value=ReadRegister(MOTUFW_REG_RATECTRL); 
    242         value &= ~(MOTUFW_BASE_RATE_MASK|MOTUFW_RATE_MULTIPLIER_MASK); 
    243         value |= new_rate; 
     200/* 
     201 * Set the device samplerate. 
     202 */ 
     203        char *src_name; 
     204       quadlet_t q, new_rate=0; 
     205        int i, supported=true; 
     206 
     207       switch ( samplingFrequency ) { 
     208               case eSF_22050Hz: 
     209                       supported=false; 
     210                       break; 
     211               case eSF_24000Hz: 
     212                       supported=false; 
     213                       break; 
     214              case eSF_32000Hz: 
     215                       supported=false; 
     216                       break; 
     217               case eSF_44100Hz: 
     218                       new_rate = MOTUFW_RATE_BASE_44100 | MOTUFW_RATE_MULTIPLIER_1X; 
     219                       break; 
     220               case eSF_48000Hz: 
     221                       new_rate = MOTUFW_RATE_BASE_48000 | MOTUFW_RATE_MULTIPLIER_1X; 
     222                       break; 
     223               case eSF_88200Hz: 
     224                       new_rate = MOTUFW_RATE_BASE_44100 | MOTUFW_RATE_MULTIPLIER_2X; 
     225                       break; 
     226               case eSF_96000Hz: 
     227                       new_rate = MOTUFW_RATE_BASE_48000 | MOTUFW_RATE_MULTIPLIER_2X; 
     228                       break; 
     229               case eSF_176400Hz: 
     230                       new_rate = MOTUFW_RATE_BASE_44100 | MOTUFW_RATE_MULTIPLIER_4X; 
     231                       break; 
     232               case eSF_192000Hz: 
     233                       new_rate = MOTUFW_RATE_BASE_48000 | MOTUFW_RATE_MULTIPLIER_4X; 
     234                       break; 
     235               default: 
     236                       supported=false; 
     237       
     238 
     239       // Update the clock control register.  FIXME: there's more to it than this 
     240       if (supported) { 
     241               quadlet_t value=ReadRegister(MOTUFW_REG_RATECTRL); 
     242               value &= ~(MOTUFW_RATE_BASE_MASK|MOTUFW_RATE_MULTIPLIER_MASK); 
     243               value |= new_rate; 
    244244//        value |= 0x04000000; 
    245         if (WriteRegister(MOTUFW_REG_RATECTRL, value) == 0) { 
    246             supported=true; 
    247         } else { 
    248             supported=false; 
    249         } 
    250     } 
    251     return supported; 
     245                if (WriteRegister(MOTUFW_REG_RATECTRL, value) == 0) { 
     246                        supported=true; 
     247                } else { 
     248                        supported=false; 
     249                } 
     250                // A write to the rate/clock control register requires the  
     251                // textual name of the current clock source be sent to the  
     252                // clock source name registers. 
     253                switch (value & MOTUFW_CLKSRC_MASK) { 
     254                        case MOTUFW_CLKSRC_INTERNAL: 
     255                                src_name = "Internal        "; 
     256                                break; 
     257                        case MOTUFW_CLKSRC_ADAT_OPTICAL: 
     258                                src_name = "ADAT Optical    "; 
     259                                break; 
     260                        case MOTUFW_CLKSRC_SPDIF_TOSLINK: 
     261                                src_name = "SPDIF/TOSLink   "; 
     262                                break; 
     263                        case MOTUFW_CLKSRC_SMTPE: 
     264                                src_name = "SMPTE           "; 
     265                                break; 
     266                        case MOTUFW_CLKSRC_WORDCLOCK: 
     267                                src_name = "Word Clock In   "; 
     268                                break; 
     269                        case MOTUFW_CLKSRC_ADAT_9PIN: 
     270                                src_name = "ADAT 9-pin      "; 
     271                                break; 
     272                        case MOTUFW_CLKSRC_AES_EBU: 
     273                                src_name = "AES-EBU         "; 
     274                                break; 
     275                        default: 
     276                                src_name = "Unknown         "; 
     277                } 
     278                for (i=0; i<16; i+=4) { 
     279                        q = (src_name[i]<<24) | (src_name[i+1]<<16) |  
     280                                (src_name[i+2]<<8) | src_name[i+3]; 
     281                        WriteRegister(MOTUFW_REG_CLKSRC_NAME0+i, q); 
     282                } 
     283        } 
     284        return supported; 
    252285} 
    253286 
  • branches/libfreebob-2.0/src/motu/motu_avdevice.h

    r300 r302  
    3232 
    3333#define MOTUFW_BASE_ADDR                0xfffff0000000ULL 
    34 #define MOTUFW_BASE_RATE_44100          (0<<3) 
    35 #define MOTUFW_BASE_RATE_48000          (1<<3) 
     34 
     35#define MOTUFW_RATE_BASE_44100          (0<<3) 
     36#define MOTUFW_RATE_BASE_48000          (1<<3) 
    3637#define MOTUFW_RATE_MULTIPLIER_1X       (0<<4) 
    3738#define MOTUFW_RATE_MULTIPLIER_2X       (1<<4) 
    3839#define MOTUFW_RATE_MULTIPLIER_4X       (2<<4) 
    39 #define MOTUFW_BASE_RATE_MASK           (0x00000008) 
     40#define MOTUFW_RATE_BASE_MASK           (0x00000008) 
    4041#define MOTUFW_RATE_MULTIPLIER_MASK     (0x00000030) 
    4142 
     
    4546#define MOTUFW_OPTICAL_MODE_MASK        (0x00000300) 
    4647 
     48#define MOTUFW_CLKSRC_MASK              0x00000007 
     49#define MOTUFW_CLKSRC_INTERNAL          0 
     50#define MOTUFW_CLKSRC_ADAT_OPTICAL      1 
     51#define MOTUFW_CLKSRC_SPDIF_TOSLINK     2 
     52#define MOTUFW_CLKSRC_SMTPE             3 
     53#define MOTUFW_CLKSRC_WORDCLOCK         4 
     54#define MOTUFW_CLKSRC_ADAT_9PIN         5 
     55#define MOTUFW_CLKSRC_AES_EBU           7 
     56 
    4757/* Device registers */ 
    4858#define MOTUFW_REG_ISOCTRL              0x0b00 
    4959#define MOTUFW_REG_RATECTRL             0x0b14 
    5060#define MOTUFW_REG_ROUTE_PORT_CONF      0x0c04 
     61#define MOTUFW_REG_CLKSRC_NAME0         0x0c60 
    5162 
    5263class ConfigRom; 
  • branches/libfreebob-2.0/support/jack/freebob_driver.c

    r301 r302  
    11761176{ 
    11771177        freebob_driver_t *drv=(freebob_driver_t *) driver; 
    1178          
     1178        // If jack hasn't called the detach method, do it now.  As of jack 0.101.1 
     1179        // the detach method was not being called explicitly on closedown, and  
     1180        // we need it to at least deallocate the iso resources. 
     1181        if (drv->dev != NULL) 
     1182                freebob_driver_detach(drv); 
    11791183        freebob_driver_delete (drv); 
    1180  
    1181 
     1184