/** * @brief This function frees the structure of adapter * * @param priv A pointer to wlan_private structure * @return n/a */ void wlan_free_adapter(wlan_private * priv) { wlan_adapter *Adapter = priv->adapter; ENTER(); if (!Adapter) { PRINTM(INFO, "Why double free adapter?:)\n"); LEAVE(); return; } PRINTM(INFO, "Free Command buffer\n"); wlan_free_cmd_buffer(priv); PRINTM(INFO, "Free CommandTimer\n"); if (Adapter->CommandTimerIsSet) { wlan_cancel_timer(&Adapter->MrvDrvCommandTimer); Adapter->CommandTimerIsSet = FALSE; } FreeTimer(&Adapter->MrvDrvCommandTimer); #ifdef REASSOCIATION PRINTM(INFO, "Free MrvDrvTimer\n"); if (Adapter->ReassocTimerIsSet) { wlan_cancel_timer(&Adapter->MrvDrvTimer); Adapter->ReassocTimerIsSet = FALSE; } FreeTimer(&Adapter->MrvDrvTimer); #endif /* REASSOCIATION */ if (Adapter->bgScanConfig) { kfree(Adapter->bgScanConfig); Adapter->bgScanConfig = NULL; } OS_FREE_LOCK(&Adapter->CurrentTxLock); OS_FREE_LOCK(&Adapter->QueueSpinLock); PRINTM(INFO, "Free ScanTable\n"); if (Adapter->ScanTable) { kfree(Adapter->ScanTable); Adapter->ScanTable = NULL; } PRINTM(INFO, "Free Adapter\n"); /* Free the adapter object itself */ kfree(Adapter); priv->adapter = NULL; LEAVE(); }
IPC_StartupCode(_filetypeed_init, filetype_ed_data *, data) #endif { short a; // Store IPC pointer data->ipc=ipc; // Fill in new window data->new_win.title=data->type->type.name; data->new_win.flags=WINDOW_VISITOR|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS; // Create timer if (!(data->drag.timer=AllocTimer(UNIT_VBLANK,0))) return 0; // Open window, create action list if (!(data->window=OpenConfigWindow(&data->new_win)) || !(data->objlist=AddObjectList(data->window,data->obj_def)) || !(data->action_list=Att_NewList(0))) { CloseConfigWindow(data->window); FreeTimer(data->drag.timer); return 0; } // Store window for drag data->drag.window=data->window; // Set window ID SetWindowID(data->window,0,WINDOW_BUTTON_CONFIG,(struct MsgPort *)data->ipc); // Build action list for (a=0;data->action_lookup[a];a+=2) { Att_NewNode( data->action_list, GetString(Locale,data->action_lookup[a]), data->action_lookup[a+1], 0); } // Disable edit and delete buttons DisableObject(data->objlist,GAD_FILETYPES_EDIT_ACTION,TRUE); // Update action and icon list filetypeed_update_actions(data); filetypeed_update_iconmenu(data); // Initialise process list InitListLock(&data->proc_list,0); return 1; }
void funced_cleanup(FuncEdData *data) { if (data) { // Free timer FreeTimer(data->drag.timer); // Free lists Att_RemList(data->flag_list,0); Att_RemList(data->func_display_list,0); Att_RemList(data->function_list,REMLIST_FREEDATA); // Free data FreeVec(data); } }
int __asm __saveds L_Module_Entry( register __a0 struct List *files, register __a1 struct Screen *callback1, register __a2 IPCData *callback2, register __a3 IPCData *main_ipc, register __d0 ULONG mod_id, register __d1 ULONG mod_data) { NewConfigWindow newwin; struct Window *window; ObjectList *objlist; Att_List *list; TimerHandle *timer; short count=0; struct Task *task; rego_data test={0}; // Call back to main program ((void __asm (*) (register __a0 struct List *, register __a1 rego_data *, register __a2 rego_data *, register __a3 void **, register __d0 ULONG))callback2)(files,&test,®o,&newwin.parent,global_checksum); // Won't work with DOpus library > 55 if (DOpusBase->lib_Version>55) return 0; // Fix IPC main_ipc->proc=(struct Process *)FindTask(0); main_ipc->proc->pr_Task.tc_UserData=main_ipc; main_ipc->list=0; if (!main_ipc->command_port) main_ipc->command_port=CreateMsgPort(); // Fill out new window newwin.parent=0; newwin.dims=&serial_window; newwin.title=GetString(locale,MSG_TITLE); newwin.locale=locale; newwin.port=0; newwin.flags=WINDOW_VISITOR|WINDOW_NO_CLOSE|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS; newwin.font=0; // Initialise timer if (!(timer=AllocTimer(UNIT_VBLANK,0))) return 0; // Open window if (!(window=OpenConfigWindow(&newwin)) || !(objlist=AddObjectList(window,serial_objects))) { CloseConfigWindow(window); FreeTimer(timer); return 0; } // Set ok flag *((ULONG *)mod_data)|=(1<<28); // Display text list=build_text_display(window,objlist,message0); // Start timer StartTimer(timer,DELAY,0); // Event loop FOREVER { struct IntuiMessage *msg; BOOL break_flag=0; // Timer returned? if (CheckTimer(timer)) { // Exit break_flag=1; } // Any Intuition messages? while (msg=GetWindowMsg(window->UserPort)) { struct IntuiMessage copy_msg; // Copy message and reply copy_msg=*msg; ReplyWindowMsg(msg); // Gadget? if (copy_msg.Class==IDCMP_GADGETUP) { struct Gadget *gadget; // Get gadget gadget=(struct Gadget *)copy_msg.IAddress; // Look at gadget ID switch (gadget->GadgetID) { // Ok case GAD_SERIAL_OKAY: break_flag=1; break; } } } if (break_flag) break; Wait(1<<window->UserPort->mp_SigBit|1<<timer->port->mp_SigBit); } // Close window CloseConfigWindow(window); // Free list and timer Att_RemList(list,0); FreeTimer(timer); // Success return 1; }
void FiletypeEditor(void) { filetype_ed_data *data=0; IPCData *ipc; short success=0,pending_quit=0; BOOL change_flag=0; // Do startup if (!(ipc=Local_IPC_ProcStartup((ULONG *)&data, (APTR)&_filetypeed_init))) return; // Create App stuff if ((data->app_port=CreateMsgPort())) { data->app_window=AddAppWindowA(0,0,data->window,data->app_port,0); } // Get icon image if (data->type->icon_path) { #ifdef USE_DRAWICONSTATE { char *path_copy; data->icon_image=NULL; if ((path_copy=AllocMemH(0,strlen(data->type->icon_path)+1))) { // icon_path is guaranteed to have a .info at the end stccpy(path_copy,data->type->icon_path,strlen(data->type->icon_path)-4); data->icon_image=GetCachedDiskObject(path_copy,0); FreeMemH(path_copy); } } #else data->icon_image=OpenImage(data->type->icon_path,0); #endif // Show icon image filetypeed_show_icon(data); } // Launch class editor immediately? if (data->edit_flag) filetypeed_edit_definition(data); // Message loop FOREVER { IPCMessage *msg; struct IntuiMessage *imsg; short break_flag=0; // Check drag if (config_drag_check(&data->drag)) { // End drag filetypeed_end_drag(data,0); } // Task message? while ((msg=(IPCMessage *)GetMsg(ipc->command_port))) { switch (msg->command) { // Close message? case IPC_QUIT: if (!pending_quit) { success=msg->flags; break_flag=1; } break; // Activate case IPC_ACTIVATE: if (data->window) { WindowToFront(data->window); ActivateWindow(data->window); } break; // Editor saying goodbye case IPC_GOODBYE: { ULONG which; // What's just gone? which=IPC_GetGoodbye(msg); // Class editor? if (which==(ULONG)-1) data->class_editor=0; // Icon menu editor? else if (which>15) { Att_Node *node; // Go through icon list for (node=(Att_Node *)data->icon_list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { // Match function if (((func_node *)node->data)->func==(Cfg_Function *)which) { // Clear editor pointer ((func_node *)node->data)->editor=0; // Check for invalid function if (filetypeed_check_iconmenu(data,node,FALSE)) change_flag=1; break; } } } // Normal filetype editor else data->editor[which]=0; } break; // Editor returning a function case FUNCTIONEDIT_RETURN: { short ret; if ((ret=filetypeed_receive_edit( data, (FunctionReturn *)msg->data))) { change_flag=1; filetypeed_update_actions(data); if (ret==2) filetypeed_update_iconmenu(data); } } break; // Class editor returning case CLASSEDIT_RETURN: filetypeed_receive_class(data,(Cfg_Filetype *)msg->data); change_flag=1; break; // Get a copy of a button case BUTTONEDIT_CLIP_BUTTON: // Handle this button if (filetypeed_get_button(data,(Cfg_Button *)msg->data,(Point *)msg->data_free)) change_flag=1; break; } // Reply the message IPC_Reply(msg); } // Intuimessage if (data->window) { while ((imsg=GetWindowMsg(data->window->UserPort))) { struct IntuiMessage msg_copy; struct Gadget *gadget; struct TagItem *tags; // Copy message msg_copy=*imsg; // Don't reply to IDCMPUPDATE messages just yet if (imsg->Class!=IDCMP_IDCMPUPDATE) { ReplyWindowMsg(imsg); imsg=0; } // Get gadget and tag pointers gadget=(struct Gadget *)msg_copy.IAddress; tags=(struct TagItem *)gadget; // Look at message switch (msg_copy.Class) { // Close window case IDCMP_CLOSEWINDOW: if (!pending_quit) break_flag=1; break; // Gadget case IDCMP_GADGETUP: switch (gadget->GadgetID) { // Use case GAD_FILETYPEED_USE: success=1; // Cancel case GAD_FILETYPEED_CANCEL: if (!pending_quit) break_flag=1; break; // Select a function case GAD_FILETYPEED_ACTION_LIST: { Att_Node *node; // Get selected node if (!(node=Att_FindNode(data->action_list,msg_copy.Code))) break; // Enable edit action button DisableObject(data->objlist,GAD_FILETYPES_EDIT_ACTION,FALSE); // Double-click? if (!(DoubleClick(data->last_sec,data->last_mic,msg_copy.Seconds,msg_copy.Micros)) || node!=data->last_sel) { data->last_sec=msg_copy.Seconds; data->last_mic=msg_copy.Micros; data->last_sel=node; data->last_icon=0; break; } } // Fall through case GAD_FILETYPES_EDIT_ACTION: // No current selection? if (!data->last_sel) break; // Is editor already up for this action? if (data->editor[data->last_sel->data]) IPC_Command(data->editor[data->last_sel->data],IPC_ACTIVATE,0,0,0,0); // Need to launch editor else filetypeed_edit_action(data,data->last_sel->data,data->last_sel->node.ln_Name); break; // Delete action case GAD_FILETYPES_DEL_ACTION: // No current selection? if (!data->last_sel) break; // Is editor up for this action? if (data->editor[data->last_sel->data]) IPC_Command(data->editor[data->last_sel->data],IPC_QUIT,0,0,0,0); // Delete it if (filetypeed_del_action(data,data->last_sel->data)) change_flag=1; break; // Edit filetype definition case GAD_FILETYPEED_EDIT_CLASS: // Is class editor already up for this action? if (data->class_editor) IPC_Command(data->class_editor,IPC_ACTIVATE,0,0,0,0); // Need to launch editor else filetypeed_edit_definition(data); break; // Select icon case GAD_FILETYPEED_SELECT_ICON: if (filetypeed_pick_icon(data)) change_flag=1; break; // Add to icon menu case GAD_FILETYPES_ADD_ICON_MENU: filetypeed_add_iconmenu(data); break; // Select an icon menu case GAD_FILETYPES_ICON_MENU: { Att_Node *last=data->last_icon; // Handle selection if (!(filetypeed_sel_icon(data,msg_copy.Code))) break; // Double-click? if (data->last_icon!=last || !(DoubleClick( data->last_sec, data->last_mic, msg_copy.Seconds, msg_copy.Micros))) { data->last_sec=msg_copy.Seconds; data->last_mic=msg_copy.Micros; data->last_sel=0; break; } } // Fall through case GAD_FILETYPES_EDIT_ICON_MENU: // No current selection? if (!data->last_icon) break; // Edit it filetypeed_edit_iconmenu(data,data->last_icon); break; // Delete from icon menu case GAD_FILETYPES_DEL_ICON_MENU: // No current selection? if (!data->last_icon) break; // Delete function if (filetypeed_check_iconmenu(data,data->last_icon,TRUE)) change_flag=1; break; } break; // BOOPSI message case IDCMP_IDCMPUPDATE: { short item; // Icon list? if (GetTagData(GA_ID,0,tags)!=GAD_FILETYPES_ICON_MENU) break; // Get item if ((item=GetTagData(DLV_DragNotify,-1,tags))!=-1) { // Handle selection filetypeed_sel_icon(data,item); // Start the drag config_drag_start(&data->drag,data->icon_list,item,tags,TRUE); } } break; // Ticks case IDCMP_INTUITICKS: ++data->drag.tick_count; break; // Mouse move case IDCMP_MOUSEMOVE: // Handle drag move config_drag_move(&data->drag); break; // Mouse buttons case IDCMP_MOUSEBUTTONS: // Valid drag info? if (data->drag.drag) { short ok=-1; // Dropped ok? if (msg_copy.Code==SELECTUP) { // Remember last position data->drag.drag_x=data->window->WScreen->MouseX; data->drag.drag_y=data->window->WScreen->MouseY; ok=1; } // Aborted else if (msg_copy.Code==MENUDOWN) ok=0; // End drag? if (ok!=-1 && filetypeed_end_drag(data,ok)) change_flag=1; } break; // Key press case IDCMP_RAWKEY: // Help? if (msg_copy.Code==0x5f && !(msg_copy.Qualifier&VALID_QUALIFIERS)) { // Set busy pointer SetWindowBusy(data->window); // Send help command IPC_Command(data->func_startup.main_owner,IPC_HELP,(1<<31),"File Type Editor",0,REPLY_NO_PORT); // Clear busy pointer ClearWindowBusy(data->window); } break; } // Reply to outstanding messages if (imsg) ReplyWindowMsg(imsg); } // Check break flag if (break_flag || pending_quit) { // See if all the editors are gone if (IsListEmpty(&data->proc_list.list)) break; // Send quit? if (break_flag) { IPC_ListQuit(&data->proc_list,0,success,FALSE); SetWindowBusy(data->window); } pending_quit=1; } } // AppMessage if (data->app_window) { struct AppMessage *msg; while ((msg=(struct AppMessage *)GetMsg(data->app_port))) { // Got an argument? if (msg->am_NumArgs>0) { char name[256]; short len; APTR image; // Get full name NameFromLock(msg->am_ArgList[0].wa_Lock,name,256); if (msg->am_ArgList[0].wa_Name && *msg->am_ArgList[0].wa_Name) AddPart(name,msg->am_ArgList[0].wa_Name,256); // Add .info if ((len=strlen(name))<6 || stricmp(name+len-5,".info")!=0) strcat(name,".info"); // Try to get image #ifdef USE_DRAWICONSTATE { char *path_copy; image=NULL; if ((path_copy=AllocMemH(0,strlen(name)+1))) { // icon_path is guaranteed to have a .info at the end stccpy(path_copy,name,strlen(name)-4); image=GetCachedDiskObject(path_copy,0); FreeMemH(path_copy); } } #else image=OpenImage(name,0); #endif if (image) { // Store path FreeMemH(data->type->icon_path); if ((data->type->icon_path=AllocMemH(0,strlen(name)+1))) strcpy(data->type->icon_path,name); // Free existing image #ifdef USE_DRAWICONSTATE FreeCachedDiskObject(data->icon_image); #else CloseImage(data->icon_image); #endif data->icon_image=image; // Show new image filetypeed_show_icon(data); change_flag=1; } } // Reply message ReplyMsg((struct Message *)msg); } } Wait(1<<ipc->command_port->mp_SigBit| 1<<data->drag.timer->port->mp_SigBit| ((data->window)?(1<<data->window->UserPort->mp_SigBit):0)| ((data->app_window)?(1<<data->app_port->mp_SigBit):0)); } // End any drag in progress filetypeed_end_drag(data,0); // Need to send button back? if (success==1 && change_flag) { if (IPC_Command( data->owner_ipc, FILETYPEEDIT_RETURN, (ULONG)data->type, data->node, 0, REPLY_NO_PORT)) { data->node=0; } } // Free edit filetype FreeFiletype(data->type); // Remove AppWindow RemoveAppWindow(data->app_window); // Close window CloseConfigWindow(data->window); // Close app port if (data->app_port) { struct Message *msg; while ((msg=GetMsg(data->app_port))) ReplyMsg(msg); DeleteMsgPort(data->app_port); } // Say goodbye IPC_Goodbye(ipc,data->owner_ipc,(success==-1)?0:(ULONG)data->node); // Free icon image #ifdef USE_DRAWICONSTATE FreeCachedDiskObject(data->icon_image); #else CloseImage(data->icon_image); #endif // Close timer FreeTimer(data->drag.timer); // Free data IPC_Free(ipc); Att_RemList(data->action_list,0); Att_RemList(data->icon_list,REMLIST_FREEDATA); FreeVec(data); }
// Cleanup a lister void lister_cleanup(Lister *lister,BOOL bye) { struct Node *node; // Send goodbye message? if (bye) { // Update our position if (!(environment->env->lister_options&LISTEROPTF_SNAPSHOT)) PositionUpdate(lister,0); // Send goodbye message IPC_Goodbye(lister->ipc,&main_ipc,WINDOW_LISTER); } // Is lister iconified? if (lister->appicon) { // Remove AppIcon RemoveAppIcon(lister->appicon); // Free icon FreeDiskObjectCopy(lister->appicon_icon); } // If we still have a progress window, close it lister_progress_off(lister); // Showing a special buffer? if (lister->cur_buffer==lister->special_buffer) { // Return to normal lister->cur_buffer=lister->old_buffer; } // Remove buffer lock if (lister->cur_buffer) { // Get buffer list lock lock_listlock(&GUI->buffer_list,TRUE); // Unlock buffer buffer_clear_lock(lister->cur_buffer,1); // If buffer is empty or buffer count exceeds maximum, free it if (lister->cur_buffer->buf_TotalEntries[0]==0 || GUI->buffer_count>environment->env->settings.max_buffer_count || (environment->env->settings.dir_flags&DIRFLAGS_DISABLE_CACHING)) { // Free buffer lister_free_buffer(lister->cur_buffer); } // Unlock buffer list unlock_listlock(&GUI->buffer_list); } // Free user data while ((node=lister->user_data_list.list.lh_Head)->ln_Succ) { Remove(node); FreeMemH(node); } // Free ports if (lister->app_port) { DOpusAppMessage *msg; while ((msg=(DOpusAppMessage *)GetMsg(lister->app_port))) ReplyAppMessage(msg); DeleteMsgPort(lister->app_port); } // Close font if (lister->font) CloseFont(lister->font); // Free signals if (lister->abort_signal!=-1) FreeSignal(lister->abort_signal); if (lister->hot_name_bit!=-1) FreeSignal(lister->hot_name_bit); // Free timer stuff if (lister->timer_port) { // Close timers FreeTimer(lister->foo_timer); FreeTimer(lister->icon_drag_timer); FreeTimer(lister->busy_timer); FreeTimer(lister->edit_timer); FreeTimer(lister->scroll_timer); // Delete timer port DeleteMsgPort(lister->timer_port); } // Free regions if (lister->title_region) DisposeRegion(lister->title_region); if (lister->refresh_extra) DisposeRegion(lister->refresh_extra); // Free special buffer if (lister->special_buffer) buffer_free(lister->special_buffer); // Free reselection FreeReselect(&lister->reselect); // Free history Att_RemList(lister->path_history,0); // Free popup menu PopUpFreeHandle(lister->lister_tool_menu); // Free toolbar FreeToolBar(lister->toolbar_alloc); // Free IPC data IPC_Free(lister->ipc); // Free lister data lister_free(lister); // Decrement count --main_lister_count; }
// Check that a screen can close if Opus disappears BOOL check_closescreen(struct Screen *screen) { ULONG lock; struct Window *window=0; TimerHandle *timer=0; short a; // Try this four times for (a=0;a<4;a++) { // Lock IntuitionBase lock=LockIBase(0); // Go through window list for (window=screen->FirstWindow; window; window=window->NextWindow) { // Not a Workbench tool window? if (!(window->Flags&WFLG_WBENCHWINDOW)) { // If this is one of Opus', GetWindowID() should know about it if (GetWindowID(window)==WINDOW_UNKNOWN) { BOOL ok=0; struct Task *task=0; // Special case for IPrefs requester - get window's task if (window->UserPort) task=(struct Task *)window->UserPort->mp_SigTask; // Valid name? if (task && task->tc_Node.ln_Name) { // Owned by IPrefs? if (strcmp(task->tc_Node.ln_Name,"« IPrefs »")==0) ok=1; } // If not ok, fail if (!ok) break; } } } // Unlock IntuitionBase UnlockIBase(lock); // Ok to shut? if (!window) break; // Allocate timer if don't already have it if (!timer && !(timer=AllocTimer(UNIT_VBLANK,0))) break; // Start timer and wait for it StartTimer(timer,0,250000); while (!CheckTimer(timer)) WaitPort(timer->port); } // Free timer FreeTimer(timer); // If window==NULL we can shut return (BOOL)(!window); }
int main(int argc, char **argv) { int bytesLeft, nRead, err, offset, outOfData, eofReached; unsigned char readBuf[READBUF_SIZE], *readPtr; short outBuf[MAX_NCHAN * MAX_NGRAN * MAX_NSAMP]; FILE *infile, *outfile; MP3FrameInfo mp3FrameInfo; HMP3Decoder hMP3Decoder; int startTime, endTime, diffTime, totalDecTime, nFrames; #ifdef ARM_ADS float audioSecs; #endif if (argc != 3) { printf("usage: mp3dec infile.mp3 outfile.pcm\n"); return -1; } infile = fopen(argv[1], "rb"); if (!infile) { printf("file open error\n"); return -1; } if (strcmp(argv[2], "nul")) { outfile = fopen(argv[2], "wb"); if (!outfile) { printf("file open error\n"); return -1; } } else { outfile = 0; /* nul output */ } DebugMemCheckInit(); InitTimer(); DebugMemCheckStartPoint(); if ( (hMP3Decoder = MP3InitDecoder()) == 0 ) return -2; DebugMemCheckEndPoint(); bytesLeft = 0; outOfData = 0; eofReached = 0; readPtr = readBuf; nRead = 0; totalDecTime = 0; nFrames = 0; do { /* somewhat arbitrary trigger to refill buffer - should always be enough for a full frame */ if (bytesLeft < 2*MAINBUF_SIZE && !eofReached) { nRead = FillReadBuffer(readBuf, readPtr, READBUF_SIZE, bytesLeft, infile); bytesLeft += nRead; readPtr = readBuf; if (nRead == 0) eofReached = 1; } /* find start of next MP3 frame - assume EOF if no sync found */ offset = MP3FindSyncWord(readPtr, bytesLeft); if (offset < 0) { outOfData = 1; break; } readPtr += offset; bytesLeft -= offset; /* decode one MP3 frame - if offset < 0 then bytesLeft was less than a full frame */ startTime = ReadTimer(); err = MP3Decode(hMP3Decoder, &readPtr, &bytesLeft, outBuf, 0); nFrames++; endTime = ReadTimer(); diffTime = CalcTimeDifference(startTime, endTime); totalDecTime += diffTime; #if defined ARM_ADS && defined MAX_ARM_FRAMES printf("frame %5d start = %10d, end = %10d elapsed = %10d ticks\r", nFrames, startTime, endTime, diffTime); fflush(stdout); #endif if (err) { /* error occurred */ switch (err) { case ERR_MP3_INDATA_UNDERFLOW: outOfData = 1; break; case ERR_MP3_MAINDATA_UNDERFLOW: /* do nothing - next call to decode will provide more mainData */ break; case ERR_MP3_FREE_BITRATE_SYNC: default: outOfData = 1; break; } } else { /* no error */ MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo); if (outfile) fwrite(outBuf, mp3FrameInfo.bitsPerSample / 8, mp3FrameInfo.outputSamps, outfile); } #if defined ARM_ADS && defined MAX_ARM_FRAMES if (nFrames >= MAX_ARM_FRAMES) break; #endif } while (!outOfData); #ifdef ARM_ADS MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo); audioSecs = ((float)nFrames * mp3FrameInfo.outputSamps) / ( (float)mp3FrameInfo.samprate * mp3FrameInfo.nChans); printf("\nTotal clock ticks = %d, MHz usage = %.2f\n", totalDecTime, ARMULATE_MUL_FACT * (1.0f / audioSecs) * totalDecTime * GetClockDivFactor() / 1e6f); printf("nFrames = %d, output samps = %d, sampRate = %d, nChans = %d\n", nFrames, mp3FrameInfo.outputSamps, mp3FrameInfo.samprate, mp3FrameInfo.nChans); #endif MP3FreeDecoder(hMP3Decoder); fclose(infile); if (outfile) fclose(outfile); FreeTimer(); DebugMemCheckFree(); return 0; }