T3D图形库(六)

 DirectSound && DirectMusic 库文件部分

 

  1. /*2008.10.4
  2. T3D图形库
  3. ——<<windows游戏
  4. 编程大师技巧>>
  5. */
  6. // INCLUDES ///
  7. #define WIN32_LEAN_AND_MEAN  
  8. #include <windows.h>   // include important windows stuff
  9. #include <windowsx.h> 
  10. #include <mmsystem.h>
  11. #include <objbase.h>
  12. #include <iostream.h> // include important C/C++ stuff
  13. #include <conio.h>
  14. #include <stdlib.h>
  15. #include <malloc.h>
  16. #include <memory.h>
  17. #include <string.h>
  18. #include <stdarg.h>
  19. #include <stdio.h>
  20. #include <math.h>
  21. #include <io.h>
  22. #include <fcntl.h>
  23. #include <direct.h>
  24. #include <wchar.h>
  25. #include <ddraw.h>  // directX includes
  26. #include <dsound.h>
  27. #include <dmksctrl.h>
  28. #include <dmusici.h>
  29. #include <dmusicc.h>
  30. #include <dmusicf.h>
  31. #include "DS&DM_LIB.h"
  32. // EXTERNALS /
  33. extern HWND main_window_handle;     // 窗口句柄
  34. // GLOBALS 
  35. // directsound stuff
  36. LPDIRECTSOUND       lpds = NULL;    // directsound interface pointer
  37. DSBUFFERDESC        dsbd;           // directsound description
  38. DSCAPS              dscaps;         // directsound caps
  39. HRESULT             dsresult;       // general directsound result
  40. DSBCAPS             dsbcaps;        // directsound buffer caps
  41. LPDIRECTSOUNDBUFFER lpdsbprimary = NULL;   // the primary mixing buffer
  42. pcm_sound           sound_fx[MAX_SOUNDS];    // the array of secondary sound buffers
  43. WAVEFORMATEX        pcmwf;          // generic waveformat structure
  44. // direct music stuff
  45. IDirectMusicPerformance    *dm_perf = NULL;    // the directmusic performance manager 
  46. IDirectMusicLoader         *dm_loader = NULL;  // the directmusic loader
  47. DMUSIC_MIDI                dm_midi[DM_NUM_SEGMENTS]; // 定义了所有的midi音乐对象
  48. int dm_active_id = -1;     // 当前的DM音乐文件id号
  49. // 函数定义 //
  50. int DSound_Load_WAV(char *filename, int control_flags /* = DSBCAPS_CTRLDEFAULT */)
  51. {
  52.   //此函数加载一个.wav文件,设置directsound缓冲,加载数据进内存并返回声音文件的id号
  53.   HMMIO        hwav;
  54.   MMCKINFO     parent,
  55.                child;
  56.   WAVEFORMATEX wfmtx;
  57.   int sound_id = -1,
  58.       index;
  59.   UCHAR *snd_buffer,
  60.         *audio_ptr_1=NULL,
  61.         *audio_ptr_2=NULL;
  62.   DWORD audio_length_1=0,
  63.         audio_length_2=0;
  64.   for (index=0;index<MAX_SOUNDS;index++)
  65.   {
  66.     if (sound_fx[index].state==SOUND_NULL)
  67.     {
  68.       sound_id = index;
  69.       break;
  70.     }
  71.   }
  72.   if (sound_id==-1)
  73.     return(-1);
  74.   parent.ckid         =(FOURCC)0;
  75.   parent.ckid         =0;
  76.   parent.fccType      =(FOURCC)0;
  77.   parent.dwDataOffset =0;
  78.   parent.dwFlags      =0;
  79.   child = parent;
  80.   //打开.wav文件
  81.   if((hwav = mmioOpen(filename,NULL,MMIO_READ | MMIO_ALLOCBUF))==NULL)
  82.     return(-1);
  83.   parent.fccType = mmioFOURCC('W','A','V','E');
  84.   //定位到wave区
  85.   if (mmioDescend(hwav,&parent,NULL,MMIO_FINDRIFF))
  86.   {
  87.     mmioClose(hwav,0);
  88.     return(-1);
  89.   }
  90.   
  91.   child.ckid = mmioFOURCC('f','m','t',' ');
  92.   //定位到fmt区
  93.   if (mmioDescend(hwav,&child,&parent,0))
  94.   {
  95.     mmioClose(hwav,0);
  96.     return(-1);
  97.   }
  98.   //读取.wav文件格式信息
  99.   if (mmioRead(hwav,(char*)&wfmtx,sizeof(wfmtx))!=sizeof(wfmtx))
  100.   {
  101.     mmioClose(hwav,0);
  102.     return(-1);
  103.   }
  104.   //若格式并非PCM
  105.   if (wfmtx.wFormatTag!=WAVE_FORMAT_PCM)
  106.   {
  107.     mmioClose(hwav,0);
  108.     return(-1);
  109.   }
  110.   if (mmioAscend(hwav,&child,0))
  111.   {
  112.     mmioClose(hwav,0);
  113.     return(-1);
  114.   }
  115.   child.ckid = mmioFOURCC('d','a','t','a');
  116.   //定位到data区
  117.   if (mmioDescend(hwav,&child,&parent,MMIO_FINDCHUNK))
  118.   {
  119.     mmioClose(hwav,0);
  120.     return(-1);
  121.   }
  122.   //开辟足够的内存(声音数据大小)赋予临时缓冲
  123.   snd_buffer = (UCHAR*)malloc(child.cksize);
  124.   //读数据内容到缓冲
  125.   mmioRead(hwav,(char*)snd_buffer,child.cksize);
  126.   mmioClose(hwav,0);
  127.   sound_fx[sound_id].rate = wfmtx.nSamplesPerSec;
  128.   sound_fx[sound_id].size = child.cksize;
  129.   sound_fx[sound_id].state= SOUND_LOADED; //标记
  130.   memset(&pcmwf,0,sizeof(WAVEFORMATEX));
  131.   pcmwf.wFormatTag      = WAVE_FORMAT_PCM;
  132.   pcmwf.nChannels       = 1;
  133.   pcmwf.nSamplesPerSec  = 11025;
  134.   pcmwf.nBlockAlign     = 1;
  135.   pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec*pcmwf.nBlockAlign;
  136.   pcmwf.wBitsPerSample  = 8;
  137.   pcmwf.cbSize          = 0;
  138.   dsbd.dwSize           = sizeof(DSBUFFERDESC);
  139.   dsbd.dwFlags          = control_flags | DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE; // 默认控制|静态声音|系统内存
  140.   dsbd.dwBufferBytes    = child.cksize;
  141.   dsbd.lpwfxFormat      = &pcmwf;
  142.   //创建DS缓冲区
  143.   if (FAILED(lpds->CreateSoundBuffer(&dsbd,&sound_fx[sound_id].dsbuffer,NULL)))
  144.   {
  145.     free(snd_buffer);
  146.     return(-1);
  147.   }
  148.   if(FAILED(sound_fx[sound_id].dsbuffer->Lock(0,
  149.                                          child.cksize,
  150.                                          (void**)&audio_ptr_1,
  151.                                          &audio_length_1,
  152.                                          (void**)&audio_ptr_2,
  153.                                          &audio_length_2,
  154.                                          DSBLOCK_FROMWRITECURSOR)))
  155.                                     return(-1); 
  156.   //将临时缓冲的声音数据转到DS缓冲
  157.   memcpy(audio_ptr_1,snd_buffer,audio_length_1);
  158.   memcpy(audio_ptr_2,(snd_buffer+audio_length_1),audio_length_2);
  159.   if (FAILED(sound_fx[sound_id].dsbuffer->Unlock(audio_ptr_1,
  160.                                             audio_length_1,
  161.                                             audio_ptr_2,
  162.                                             audio_length_2)))
  163.                                     return(-1);
  164.   free(snd_buffer);
  165.   return(sound_id);
  166. }
  167. // copy DS声音文件,你需要先加载一个,然后传入该声音的id索引,
  168. //函数返回copy的新的DS声音文件ID号
  169. int DSound_Replicate_Sound(int source_id)
  170. {
  171.   if (source_id!=-1)
  172.   { 
  173.     for (int id=0;id<MAX_SOUNDS;id++)
  174.     {
  175.       if (sound_fx[id].state==SOUND_NULL)
  176.       {
  177.         sound_fx[id] = sound_fx[source_id];
  178.         //DS 缓冲区copy过程
  179.         if (FAILED(lpds->DuplicateSoundBuffer(sound_fx[source_id].dsbuffer,
  180.                                         &sound_fx[id].dsbuffer)))
  181.         {
  182.           //失败则还原标记
  183.           sound_fx[id].dsbuffer = NULL;
  184.           sound_fx[id].state    = SOUND_NULL;
  185.           return(-1);
  186.         }
  187.         sound_fx[id].id = id;
  188.         return(id);
  189.       }
  190.     }
  191.   }
  192.   else
  193.     return(-1);
  194.   return(-1);
  195. }
  196. int DSound_Init(void)
  197. {
  198.   static int first_time = 1;
  199.   //如果是第一次初始化(创建DS接口对象及设置相应协作模式)
  200.   if (first_time)
  201.   {
  202.     memset(sound_fx,0,sizeof(pcm_sound)*MAX_SOUNDS);
  203.     first_time = 0;
  204.     if (FAILED(DirectSoundCreate(NULL,&lpds,NULL)))
  205.       return(0);
  206.   
  207.     if (FAILED(lpds->SetCooperativeLevel((HWND)main_window_handle,DSSCL_NORMAL)))
  208.       return(0);
  209.   }
  210.   //
  211.   for (int index=0;index<MAX_SOUNDS;index++)
  212.   {
  213.     if (sound_fx[index].dsbuffer)
  214.     {
  215.       sound_fx[index].dsbuffer->Stop();
  216.       sound_fx[index].dsbuffer->Release();
  217.     }
  218.     memset(&sound_fx[index],0,sizeof(pcm_sound));
  219.     sound_fx[index].state = SOUND_NULL;
  220.     sound_fx[index].id    = index;   //标记索引
  221.   }
  222.   return(1);
  223. }
  224. int DSound_Shutdown(void)
  225. {
  226.   //首先关闭所有声音
  227.   DSound_Stop_All_Sounds();
  228.   //然后释放DS缓冲
  229.   for (int index=0;index<MAX_SOUNDS;index++)
  230.     if (sound_fx[index].dsbuffer)
  231.       sound_fx[index].dsbuffer->Release();
  232.   //最后释放DS接口
  233.   if (lpds)
  234.     lpds->Release();
  235.   return(1);
  236. }
  237. int DSound_Play(int id, int flags/* =0 */int volume/* =0 */int rate/* =0 */int pan/* =0 */)
  238. {
  239.   if (sound_fx[id].dsbuffer)
  240.   {
  241.     // 设置DS缓冲区为起始播放
  242.     if(FAILED(sound_fx[id].dsbuffer->SetCurrentPosition(0)))
  243.       return(0);
  244.     if(FAILED(sound_fx[id].dsbuffer->Play(0,0,flags)))
  245.       return(0);
  246.   }
  247.   return(1);
  248. }
  249. int DSound_Set_Volume(int id,int vol)
  250. {
  251.   //此函数设置DS声音大小
  252.   if (sound_fx[id].dsbuffer->SetVolume(DSVOLUME_TO_DB(vol))!=DS_OK)
  253.     return(0);
  254.   return(1);
  255. }
  256. int DSound_Set_Freq(int id,int freq)
  257. {
  258.   //此函数设置DS 声音频率
  259.   if(sound_fx[id].dsbuffer->SetFrequency(freq)!=DS_OK)
  260.     return(0);
  261.   return(1);
  262. }
  263. int DSound_Set_Pan(int id,int pan)
  264. {
  265.   //此函数设置DS 声音平衡性(+为偏右)
  266.   if(sound_fx[id].dsbuffer->SetPan(pan)!=DS_OK)
  267.     return(0);
  268.   return(1);
  269. }
  270. int DSound_Stop_Sound(int id)
  271. {
  272.   if (sound_fx[id].dsbuffer)
  273.   {
  274.     sound_fx[id].dsbuffer->Stop();
  275.     sound_fx[id].dsbuffer->SetCurrentPosition(0);
  276.   }
  277.   return(1);
  278. }
  279. int DSound_Stop_All_Sounds(void)
  280. {
  281.   for (int index=0;index<MAX_SOUNDS;index++)
  282.   {
  283.     DSound_Stop_Sound(index);
  284.   }
  285.   return(1);
  286. int DSound_Delete_Sound(int id)
  287. {
  288.   if(!DSound_Stop_Sound(id))
  289.     return(0);
  290.   if (sound_fx[id].dsbuffer)
  291.   {
  292.     sound_fx[id].dsbuffer->Release();
  293.     sound_fx[id].dsbuffer = NULL;
  294.     return(1);
  295.   }
  296.   return(1);
  297. }
  298. int DSound_Delete_All_Sounds(void)
  299. {
  300.   for(int index=0;index<MAX_SOUNDS;index++)
  301.     DSound_Delete_Sound(index);
  302.   return(1);
  303. }
  304. int DSound_Status_Sound(int id)
  305. {
  306.   //此函数取得当前DS缓冲区状态
  307.   if (sound_fx[id].dsbuffer)
  308.   {
  309.     ULONG status;
  310.     sound_fx[id].dsbuffer->GetStatus(&status);
  311.     return(status);
  312.   }
  313.   else
  314.     return(-1);
  315. }
  316. ///
  317. int DMusic_Load_MIDI(char *filename)
  318. {
  319.   //此函数加载一个midi段(返回索引id)
  320.   DMUS_OBJECTDESC ObjDesc; 
  321.   HRESULT hr;
  322.   IDirectMusicSegment* pSegment = NULL;
  323.   int index; 
  324.   int id = -1;
  325.   for (index = 0; index < DM_NUM_SEGMENTS; index++)
  326.   {
  327.     if (dm_midi[index].state == MIDI_NULL)
  328.       {
  329.        id = index;
  330.        break;
  331.       } 
  332.   }
  333.   if (id==-1)
  334.     return(-1);
  335.   //取得当前工作目录 
  336.   char szDir[_MAX_PATH];
  337.   WCHAR wszDir[_MAX_PATH]; 
  338.   if(_getcwd( szDir, _MAX_PATH ) == NULL)
  339.   {
  340.     return(-1);;
  341.   } 
  342.   //多字节字符转换为宽字节字符串
  343.   MULTI_TO_WIDE(wszDir, szDir);
  344.   // 告诉加载器搜索目录
  345.   hr = dm_loader->SetSearchDirectory(GUID_DirectMusicAllTypes,wszDir, FALSE);
  346.   if (FAILED(hr)) 
  347.    {
  348.      return (-1);
  349.    } 
  350.   WCHAR wfilename[_MAX_PATH]; 
  351.   MULTI_TO_WIDE(wfilename, filename);
  352.   // 初始化ObjDesc
  353.   DD_INIT_STRUCT(ObjDesc);
  354.   ObjDesc.guidClass = CLSID_DirectMusicSegment;
  355.   wcscpy(ObjDesc.wszFileName, wfilename );
  356.   ObjDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_FILENAME; //标记有效数据
  357.   //取得DM 段
  358.   hr = dm_loader->GetObject(&ObjDesc,IID_IDirectMusicSegment, (void**) &pSegment);
  359.   if (FAILED(hr))
  360.      return(-1);
  361.   //设置midi相关参数
  362.   hr = pSegment->SetParam(GUID_StandardMIDIFile,-1, 0, 0, (void*)dm_perf);
  363.   if (FAILED(hr))
  364.      return(-1);
  365.   hr = pSegment->SetParam(GUID_Download, -1, 0, 0, (void*)dm_perf);
  366.   if (FAILED(hr))
  367.      return(-1);
  368.   dm_midi[id].dm_segment  = pSegment; //标记DM段
  369.   dm_midi[id].dm_segstate = NULL;
  370.   dm_midi[id].state       = MIDI_LOADED;  //标记状态
  371.   return(id);
  372. int DMusic_Play(int id)
  373. {
  374.   if (dm_midi[id].dm_segment && dm_midi[id].state!=MIDI_NULL)
  375.   {
  376.     //如果当前有音乐在播放则关闭它
  377.     if(dm_active_id!=-1)
  378.       DMusic_Stop(dm_active_id);
  379.     dm_perf->PlaySegment(dm_midi[id].dm_segment,0,0,&dm_midi[id].dm_segstate);
  380.     dm_midi[id].state = MIDI_PLAYING;
  381.     dm_active_id = id;
  382.     return(1);
  383.   }
  384.   else
  385.     return(0);
  386. }
  387. int DMusic_Stop(int id)
  388. {
  389.   if (dm_midi[id].dm_segment && dm_midi[id].state!=NULL)
  390.   {
  391.     dm_perf->Stop(dm_midi[id].dm_segment,NULL,0,0);
  392.     dm_midi[id].state = MIDI_STOPPED;
  393.     // 重置活动的音乐索引id
  394.     dm_active_id = -1;
  395.   }
  396.   return(1);
  397. }
  398. int DMusic_Delete_MIDI(int id)
  399. {
  400.   if (dm_midi[id].dm_segment)
  401.   {
  402.     //首先卸载段
  403.     dm_midi[id].dm_segment->SetParam(GUID_Unload,-1,0,0,(void*)dm_perf);
  404.     //然后释放段内存
  405.     dm_midi[id].dm_segment->Release();
  406.     dm_midi[id].dm_segment  = NULL;
  407.     //重置标记
  408.     dm_midi[id].dm_segstate = NULL;
  409.     dm_midi[id].state       = MIDI_NULL;
  410.   }
  411.   return(1);
  412. }
  413. int DMusic_Delete_All_MIDI(void)
  414. {
  415.   //删除所有MIDI资源
  416.   int index;
  417.   for (index=0;index<DM_NUM_SEGMENTS;index++)
  418.   {
  419.     if (dm_midi[index].dm_segment)
  420.     {
  421.       dm_midi[index].dm_segment->SetParam(GUID_Unload,-1,0,0,(void*)dm_perf);
  422.       dm_midi[index].dm_segment->Release();
  423.       dm_midi[index].dm_segment  = NULL;
  424.       dm_midi[index].dm_segstate = NULL;
  425.       dm_midi[index].state       = MIDI_NULL;
  426.     }
  427.   }
  428.   return(1);
  429. }
  430. int DMusic_Status_MIDI(int id)
  431. {
  432.   //返回当前音乐播放状态
  433.   if (dm_midi[id].dm_segment && dm_midi[id].state!=MIDI_NULL)
  434.   {
  435.     if(dm_perf->IsPlaying(dm_midi[id].dm_segment,NULL)==S_OK)
  436.       dm_midi[id].state = MIDI_PLAYING;
  437.     else
  438.       dm_midi[id].state = MIDI_STOPPED;
  439.     return(dm_midi[id].state);
  440.   }
  441.   else
  442.     return(0);
  443. }
  444. int DMusic_Init(void)
  445. {
  446.   int index;
  447.   //初始化COM
  448.   if (FAILED(CoInitialize(NULL)))
  449.     return(0);
  450.   //创建DirectMusicPerformance接口对象
  451.   if (FAILED(CoCreateInstance(CLSID_DirectMusicPerformance,
  452.                               NULL,
  453.                               CLSCTX_INPROC,
  454.                               IID_IDirectMusicPerformance,
  455.                               (void**)&dm_perf)))
  456.   {
  457.     return(0);
  458.   }
  459.   //初始化DMP (传入DS对象)
  460.   if (FAILED(dm_perf->Init(NULL,lpds,main_window_handle)))
  461.   {
  462.     return(0);
  463.   }
  464.   //默认连接微软软件合成器端口
  465.   if (FAILED(dm_perf->AddPort(NULL)))
  466.   {
  467.     return(0);
  468.   }
  469.   //创建midi加载器
  470.   if (FAILED(CoCreateInstance(CLSID_DirectMusicLoader,
  471.                               NULL,
  472.                               CLSCTX_INPROC,
  473.                               IID_IDirectMusicLoader,
  474.                               (void**)&dm_loader)))
  475.   {
  476.     return(0);
  477.   }
  478.   //初始化dm_midi结构体
  479.   for (index=0;index<DM_NUM_SEGMENTS;index++)
  480.   {
  481.     dm_midi[index].dm_segment = NULL;
  482.     dm_midi[index].dm_segstate= NULL;
  483.     dm_midi[index].state      = MIDI_NULL;
  484.     dm_midi[index].id         = index;
  485.   }
  486.   dm_active_id = -1;
  487.   return(1);
  488. }
  489. int DMusic_Shutdown(void)
  490. {
  491.   //停止播放音乐
  492.   if(dm_perf)
  493.     dm_perf->Stop(NULL,NULL,0,0);
  494.   //删除midi资源
  495.   DMusic_Delete_All_MIDI();
  496.   //释放dm_perf
  497.   if (dm_perf)
  498.   {
  499.     dm_perf->CloseDown();
  500.     dm_perf->Release();
  501.   }
  502.   //释放dm_loader
  503.   if(dm_loader)
  504.     dm_loader->Release();
  505.   //释放COM
  506.   CoUninitialize();
  507.   return(1);
  508. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Allwinnertech T3是一款中央处理器(CPU)型号,主要用于智能电视、车载导航和其他嵌入式设备。为了下载Allwinnertech T3的相关软件或固件,我们可以按照以下步骤进行操作: 首先,我们需要访问Allwinnertech官方网站或其他可信的软件下载网站。在主页或搜索栏中输入"Allwinnertech T3"并点击搜索。 随后,会出现一系列相关的软件、固件或驱动下载选项。我们可以根据自己的设备型号和要求选择合适的下载链接。 在下载页面上,我们通常会看到软件或固件的版本号、发布日期和相关说明。我们可以仔细阅读这些信息,确保下载的是适用于我们设备的最新版本。 在确认选择后,我们可以点击下载按钮,选择保存位置。下载速度取决于网络连接的稳定性和下载文件的大小。 下载完成后,我们可以根据需要解压缩或安装下载的文件。通常情况下,跟随下载的应该会有详细的安装说明。 值得注意的是,下载和安装涉及到软件和固件的操作需要小心谨慎。我们应该仔细阅读相关的使用手册或联系Allwinnertech的售后服务团队,以确保正确和安全地进行下载和安装。 总之,通过访问Allwinnertech官方网站或其他可信的软件下载网站,我们可以下载到Allwinnertech T3的相关软件或固件,并根据下载的文件进行相应操作。 ### 回答2: Allwinner Tech T3是一个芯片厂商Allwinner推出的一款整车互联平台。该平台通过其高性能处理器和高集成度的车载系统,为车辆提供了丰富的智能化功能和互联服务。 要下载Allwinner Tech T3平台上的相关软件和驱动程序,可以参考以下步骤: 1. 首先,访问Allwinner Tech官方网站(www.allwinnertech.com)。 2. 在网站主页上,点击“Support”或“Support/Download”选项。 3. 在支持页面上,选择“T3 Platform”或类似的选项,以获取Allwinner Tech T3平台的支持。 4. 在T3平台的支持页面上,您可以找到相关的软件、驱动和工具下载链接。 5. 单击所需的下载链接,在新的页面上选择合适的版本和操作系统平台。然后,点击“下载”按钮开始下载。 6. 下载完成后,您可以在计算机上找到并安装所下载的软件和驱动程序。 请注意,下载和使用软件和驱动程序时,请务必遵循Allwinner Tech的相关法律法规和使用条款。此外,在下载和安装之前,建议查看官方网站上提供的使用指南和技术支持文档,以便更好地了解如何使用Allwinner Tech T3平台。 以上就是关于Allwinner Tech T3下载的简单介绍和操作步骤。希望对您有所帮助! ### 回答3: Allwinnertech T3是一款智能终端设备,具有下载功能。用户可以使用T3设备进行各种下载操作。 首先,Allwinnertech T3设备内置有一个强大的下载管理器,用户可以通过该管理器下载各种文件,例如应用程序、音乐、视频和文档等。用户只需打开下载管理器,输入下载链接或搜索关键词,就能开始下载所需的内容。 其次,用户可以通过Allwinnertech T3设备上的浏览器进行在线下载。当用户在浏览器中浏览网页时,如果发现某个文件需要下载,只需点击文件链接即可开始下载。 Allwinnertech T3还支持通过各种下载应用程序进行下载。用户可以根据自己的需求在应用商店中搜索并下载适合自己的下载应用程序。这些应用程序通常提供更多的下载选项和功能,例如多线程下载、断点续传和下载速度优化等。 最后,Allwinnertech T3设备还支持通过USB接口进行下载。用户可以将需要下载的文件通过USB线连接到T3设备,然后在设备中找到相关文件并进行下载。 总之,Allwinnertech T3是一款功能强大的智能终端设备,具备多种下载方式,用户可以根据自己的需求选择最合适的下载方法。无论是下载应用程序、音乐、视频还是其他文件,T3都能满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值