rem: strcat( audioctrl->ahiac_DriverName, ".audio" );
add: strcat( driver_name, ".audio" );  AddPart(audioctrl->ahiac_DriverName, driver_name, sizeof(audioctrl->ahiac_DriverName));
context: CreateAudioCtrl(struct TagItem *tags){  struct AHIPrivAudioCtrl *audioctrl;  struct AHI_AudioDatabase *audiodb;  struct TagItem *dbtags;  BOOL   error=TRUE;  ULONG data_flags = MEMF_ANY;    switch( MixBackend )  {    case MB_NATIVE:      data_flags = MEMF_PUBLIC | MEMF_CLEAR;      break;      #if defined( ENABLE_WARPUP )    case MB_WARPUP:      // Non-cached from both the PPC and m68k side      data_flags = MEMF_PUBLIC | MEMF_CLEAR | MEMF_CHIP;      break;#endif  }  audioctrl = AHIAllocVec( sizeof( struct AHIPrivAudioCtrl ),                           data_flags );  if( audioctrl != NULL )  {    audioctrl->ac.ahiac_AudioCtrl.ahiac_UserData =      (APTR)GetTagData(AHIA_UserData,NULL,tags);    audioctrl->ahiac_AudioID =      GetTagData(AHIA_AudioID,AHI_DEFAULT_ID,tags);    audioctrl->ac.ahiac_MixFreq =      GetTagData(AHIA_MixFreq,AHI_DEFAULT_FREQ,tags);    audioctrl->ac.ahiac_Channels =      GetTagData(AHIA_Channels,0,tags);    audioctrl->ac.ahiac_Sounds =      GetTagData(AHIA_Sounds,0,tags);    audioctrl->ac.ahiac_SoundFunc =      (struct Hook *)GetTagData(AHIA_SoundFunc,NULL,tags);    audioctrl->ahiac_RecordFunc =      (struct Hook *)GetTagData(AHIA_RecordFunc,NULL,tags);    audioctrl->ac.ahiac_PlayerFunc =      (struct Hook *)GetTagData(AHIA_PlayerFunc,NULL,tags);    audioctrl->ac.ahiac_PlayerFreq =      GetTagData(AHIA_PlayerFreq,0,tags);    audioctrl->ac.ahiac_MinPlayerFreq =      GetTagData(AHIA_MinPlayerFreq,0,tags);    audioctrl->ac.ahiac_MaxPlayerFreq =      GetTagData(AHIA_MaxPlayerFreq,0,tags);    audioctrl->ac.ahiac_AntiClickSamples =       GetTagData(AHIA_AntiClickSamples,~0,tags);    audioctrl->ahiac_MasterVolume=0x00010000;    audioctrl->ahiac_SetMasterVolume=0x00010000;    audioctrl->ahiac_EchoMasterVolume=0x00010000;    if(audioctrl->ahiac_AudioID == AHI_DEFAULT_ID)      audioctrl->ahiac_AudioID = AHIBase->ahib_AudioMode;    if(audioctrl->ac.ahiac_MixFreq == AHI_DEFAULT_FREQ)      audioctrl->ac.ahiac_MixFreq = AHIBase->ahib_Frequency;    if(audioctrl->ac.ahiac_PlayerFunc == NULL)      audioctrl->ac.ahiac_PlayerFunc=&DefPlayerHook;    if(audioctrl->ac.ahiac_PlayerFreq == 0)      audioctrl->ac.ahiac_PlayerFreq = DEFPLAYERFREQ;    if(audioctrl->ac.ahiac_MinPlayerFreq == 0)      audioctrl->ac.ahiac_MinPlayerFreq = DEFPLAYERFREQ;    if(audioctrl->ac.ahiac_MaxPlayerFreq == 0)      audioctrl->ac.ahiac_MaxPlayerFreq = DEFPLAYERFREQ;    if(audioctrl->ac.ahiac_PlayerFreq < 65536)      audioctrl->ac.ahiac_PlayerFreq <<= 16;    if(audioctrl->ac.ahiac_MinPlayerFreq < 65536)      audioctrl->ac.ahiac_MinPlayerFreq <<= 16;    if(audioctrl->ac.ahiac_MaxPlayerFreq < 65536)      audioctrl->ac.ahiac_MaxPlayerFreq <<= 16;    if(audioctrl->ac.ahiac_AntiClickSamples == ~0UL)      audioctrl->ac.ahiac_AntiClickSamples =           ( AHIBase->ahib_AntiClickTime * audioctrl->ac.ahiac_MixFreq ) >> 16;    if((audiodb=LockDatabase()))    {      if((dbtags=GetDBTagList(audiodb,audioctrl->ahiac_AudioID)))      {        audioctrl->ac.ahiac_Flags=PackBoolTags(GetTagData(AHIDB_Flags,NULL,dbtags),dbtags,boolmap);        if(AHIBase->ahib_Flags & AHIBF_CLIPPING)        {          audioctrl->ac.ahiac_Flags |= AHIACF_CLIPPING;        }        strcpy( audioctrl->ahiac_DriverName,                "DEVS:AHI/" );        strcat( audioctrl->ahiac_DriverName,                (char *) GetTagData( AHIDB_Driver, (ULONG) "", dbtags ) );        strcat( audioctrl->ahiac_DriverName,                ".audio" );        error=FALSE;      }      UnlockDatabase(audiodb);    }  }  if(error)  {    AHIFreeVec(audioctrl);    return NULL;  }  else    return audioctrl;}