關于USB-AUDIO使用ALSA編程的一點問題

轉載自:http://blog.chinaunix.net/uid-25272011-id-3153434.html

?

最近在調試一款原相PAP7501攝像頭中的USB的麥克風,USB層走的應該是標準的UAC協議,具體可以見USB的官網:http://www.usb.org/developers/devclass_docs#approved,而音頻部分則可以跑目前Linux標準的ALSA的PCM接口,對于硬件CODEC來說,與其是完全兼容的。
???? 給出一份參考代碼:
???? 這個是仿照arecord寫的一個簡略的測試代碼,保存為wav格式的。
1、recod.c


  1. /*

  2. This example reads from the default PCM device
  3. and writes to standard output for 5 seconds of data.

  4. */

  5. /* Use the newer ALSA API */
  6. #define ALSA_PCM_NEW_HW_PARAMS_API

  7. #include <alsa/asoundlib.h>

  8. /**************************************************************/
  9. #define ID_RIFF 0x46464952
  10. #define ID_WAVE 0x45564157
  11. #define ID_FMT 0x20746d66
  12. #define ID_DATA 0x61746164

  13. typedef unsigned long uint32_t;
  14. typedef unsigned short uint16_t;

  15. #define FORMAT_PCM 1

  16. static uint32_t totle_size = 0;

  17. struct wav_header {
  18. ????/* RIFF WAVE Chunk */
  19. ????uint32_t riff_id;
  20. ????uint32_t riff_sz;
  21. ????uint32_t riff_fmt;
  22. ????/* Format Chunk */
  23. ????uint32_t fmt_id;
  24. ????uint32_t fmt_sz;
  25. ????uint16_t audio_format;
  26. ????uint16_t num_channels;
  27. ????uint32_t sample_rate;
  28. ????uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */
  29. ????uint16_t block_align; /* num_channels * bps / 8 */
  30. ????uint16_t bits_per_sample;
  31. ????/* Data Chunk */
  32. ????uint32_t data_id;
  33. ????uint32_t data_sz;
  34. }__attribute__((packed));

  35. static struct wav_header hdr;

  36. /**************************************************************/
  37. int record_file(unsigned rate, unsigned channels, int fd, unsigned count)
  38. {
  39. ????long loops;
  40. ??? int val;
  41. ????int rc;
  42. ????int size;
  43. ????snd_pcm_t *handle;
  44. ????snd_pcm_hw_params_t *params;
  45. ????int dir;
  46. ????snd_pcm_uframes_t frames;
  47. ????char *buffer;????????????????????/* TODO */

  48. ????/* Open PCM device for recording (capture). */
  49. ????rc = snd_pcm_open(&handle, "plughw:0,0", SND_PCM_STREAM_CAPTURE, 0);
  50. ????if (rc < 0) {
  51. ????????fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc));
  52. ????????exit(1);
  53. ????}

  54. ????/* Allocate a hardware parameters object. */
  55. ????snd_pcm_hw_params_alloca(&params);

  56. ????/* Fill it in with default values. */
  57. ????snd_pcm_hw_params_any(handle, params);

  58. ????/* Set the desired hardware parameters. */

  59. ????/* Interleaved mode */
  60. ????snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);

  61. ????/* Signed 16-bit little-endian format */
  62. ????snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);

  63. ????/* Two channels (stereo) */
  64. ????snd_pcm_hw_params_set_channels(handle, params, channels);

  65. ????/* rate bits/second sampling rate (CD quality) */
  66. ????snd_pcm_hw_params_set_rate_near(handle, params, &rate, &dir);

  67. ????/* Set period size to 32 frames. */
  68. ????frames = 320;???? /* 這邊的大小也不是絕對的,可以調整 */
  69. ????snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);

  70. ????/* Write the parameters to the driver */
  71. ????rc = snd_pcm_hw_params(handle, params);
  72. ????if (rc < 0) {
  73. ????????fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc));
  74. ????????exit(1);
  75. ????}

  76. ????/* Use a buffer large enough to hold one period */
  77. ????snd_pcm_hw_params_get_period_size(params, &frames, &dir);/* 獲取實際的frames */
  78. ????
  79. ????size = frames * 2; /* 2 bytes/sample, 1 channels */
  80. ????buffer = (char *) malloc(size);

  81. ????/* We want to loop for 20 seconds 時間不一定準確 */
  82. ????snd_pcm_hw_params_get_period_time(params, &val, &dir);
  83. ????loops = 20000000 / val;
  84. ????
  85. ????while (loops > 0) {
  86. ????????loops--;
  87. ????????rc = snd_pcm_readi(handle, buffer, frames);
  88. ????????if (rc == -EPIPE) {
  89. ???????? /* EPIPE means overrun */
  90. ???????? fprintf(stderr, "overrun occurred\n");
  91. ???????? snd_pcm_prepare(handle);
  92. ????????} else if (rc < 0) {
  93. ???????? fprintf(stderr, "error from read: %s\n", snd_strerror(rc));
  94. ????????} else if (rc != (int)frames) {
  95. ???????? fprintf(stderr, "short read, read %d frames\n", rc);
  96. ????????}
  97. ????????rc = write(fd, buffer, size);
  98. ????????totle_size += rc;????????????????????????/* totle data size */
  99. ????????if (rc != size)
  100. ???????? fprintf(stderr, "short write: wrote %d bytes\n", rc);
  101. ????}
  102. ????
  103. ????lseek(fd, 0, SEEK_SET);????? /* 回到文件頭,重新更新音頻文件大小 */
  104. ????hdr.riff_sz = totle_size + 36;
  105. ????hdr.data_sz = totle_size;
  106. ????
  107. ????if (write(fd, &hdr, sizeof(hdr)) != sizeof(hdr)) {
  108. ????????fprintf(stderr, "arec: cannot write header\n");
  109. ????????return -1;
  110. ????}
  111. ????
  112. ????snd_pcm_drain(handle);
  113. ????snd_pcm_close(handle);
  114. ????free(buffer);

  115. ????return 0;
  116. }

  117. /**************************************************************/
  118. int rec_wav(const char *fn)
  119. {
  120. ????unsigned rate, channels;
  121. ????int fd;
  122. ????fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664);
  123. ????if (fd < 0) {
  124. ????????fprintf(stderr, "arec: cannot open '%s'\n", fn);
  125. ????????return -1;
  126. ????}

  127. ????hdr.riff_id = ID_RIFF;
  128. ????hdr.riff_fmt = ID_WAVE;
  129. ????hdr.fmt_id = ID_FMT;
  130. ????hdr.audio_format = FORMAT_PCM;
  131. ????hdr.fmt_sz = 16;
  132. ????hdr.bits_per_sample = 16;
  133. ????hdr.num_channels = 1;
  134. ????hdr.data_sz = 0;????????????????????????/* TODO before record over */
  135. ????hdr.sample_rate = 16000;
  136. ????hdr.data_id = ID_DATA;
  137. ????
  138. ????hdr.byte_rate = hdr.sample_rate * hdr.num_channels * hdr.bits_per_sample / 8;
  139. ????hdr.block_align = hdr.num_channels * hdr.bits_per_sample / 8;
  140. ????
  141. ????if (write(fd, &hdr, sizeof(hdr)) != sizeof(hdr)) {
  142. ????????fprintf(stderr, "arec: cannot write header\n");
  143. ????????return -1;
  144. ????}
  145. ????fprintf(stderr,"arec: %d ch, %ld hz, %d bit, %s\n",
  146. ????????????hdr.num_channels, hdr.sample_rate, hdr.bits_per_sample,
  147. ????????????hdr.audio_format == FORMAT_PCM ? "PCM" : "unknown");
  148. ????
  149. ????return record_file(hdr.sample_rate, hdr.num_channels, fd, hdr.data_sz);
  150. }

  151. int main(int argc, char **argv)
  152. {
  153. ????if (argc != 2) {
  154. ????????fprintf(stderr,"usage: arec <file>\n");
  155. ????????return -1;
  156. ????}

  157. ????return rec_wav(argv[1]);
  158. }
對于上述代碼補充說明一點,這個是設計ALSA的一點概念:

樣本長度(sample):樣本是記錄音頻數據最基本的單位,常見的有8位和16位。

通道數(channel):該參數為1表示單聲道,2則是立體聲。

楨(frame):楨記錄了一個聲音單元,其長度為樣本長度與通道數的乘積。

采樣率(rate):每秒鐘采樣次數,該次數是針對楨而言。

周期(period):音頻設備一次處理所需要的楨數,對于音頻設備的數據訪問以及音頻數據的存儲,都是以此為單位。

交錯模式(interleaved):是一種音頻數據的記錄方式,在交錯模式下,數據以連續楨的形式存放,即首先記錄完楨1的左聲道樣本和右聲道樣本(假設為立體聲格式),再開始楨2的記錄。而在非交錯模式下,首先記錄的是一個周期內所有楨的左聲道樣本,再記錄右聲道樣本,數據是以連續通道的方式存儲。不過多數情況下,我們只需要使用交錯模式就可以了。

具體可以參照:http://blog.chinaunix.net/uid-25272011-id-3151136.html

一開始我犯過一個錯誤就是rc = snd_pcm_readi(handle, buffer, frames),這個函數的參數3的單位應該是幀大小,而一個幀的大小是根據你的量化位數和聲道數決定的,對于本代碼,是16bit單聲道,自然一個幀大小是2字節,起初我將申請的buffer大小傳給了這個參數,結果必然導致“卡頓”或者“快進”,“卡頓”是因為我在項目中是實時傳輸,會導致阻塞,畢竟數據量大了一倍,“快進”則是因為緩沖區的大小是實際讀取數據的一半,有一半的數據在buffer中被自己給覆蓋掉了,所以要慎重啊。


2、Makefile

  1. exe = record
  2. src = record.c
  3. CC = arm-linux-gcc
  4. INC = -I/nfs/usr/local/arm-alsa/include
  5. LDFLAGS = -lpthread -L/nfs/usr/local/arm-alsa/lib -lasound

  6. $(exe) : $(src) FORCE
  7. ????$(CC) -o $@ $(src) $(LDFLAGS) $(INC)


  8. FORCE:

  9. clean:
  10. ????rm -f ./*.o $(exe)

????? 此處的alsa-lib庫就是之前介紹的安裝的庫的路徑,編譯可以引用該路徑的庫,而運行之后庫的路徑可不受限制,按照你定義的環境變量找到即可。
???? 對于內核的配置則在
? ? ?
  1. Device Drivers --->
  2. <*> Sound card support --->
  3. <*> Advanced Linux Sound Architecture --->
  4. [*] USB sound devices --->
  5. <*> USB Audio/MIDI driver


???? 對于這款USB麥克風,我正常的去錄音的時候,上層的直觀感覺就是卡頓,這個與上面提到的是有區別的,因為同樣的代碼在arm上是好的,所以就懷疑是底層讀慢了,(我們的應用背景是開發板實時錄音,通過USB-WIFI發到上位機同步播放)很明顯的是讀取音頻數據慢了。而同樣的代碼跑硬件的CODEC是很好的,不卡頓,所以很有可能問題出在USB上。我們剛好有USB的協議分析儀,我們USB是跑的全速模式,其描述符為

  1. Interface Descriptor:
  2. ??????bLength 9
  3. ??????bDescriptorType 4
  4. ??????bInterfaceNumber 3
  5. ??????bAlternateSetting 0
  6. ??????bNumEndpoints 0
  7. ??????bInterfaceClass 1
  8. ??????bInterfaceSubClass 2
  9. ??????bInterfaceProtocol 0
  10. ??????iInterface 0
  11. ????Interface Descriptor:
  12. ??????bLength 9
  13. ??????bDescriptorType 4
  14. ??????bInterfaceNumber 3
  15. ??????bAlternateSetting 1
  16. ??????bNumEndpoints 1
  17. ??????bInterfaceClass 1
  18. ??????bInterfaceSubClass 2
  19. ??????bInterfaceProtocol 0
  20. ??????iInterface 0
  21. ??????AudioStreaming Interface Descriptor:
  22. ????????bLength 7
  23. ????????bDescriptorType 36
  24. ????????bDescriptorSubtype 1 (AS_GENERAL)
  25. ????????bTerminalLink 3
  26. ????????bDelay 1 frames
  27. ????????wFormatTag 1 PCM
  28. ??????AudioStreaming Interface Descriptor:
  29. ????????bLength 11
  30. ????????bDescriptorType 36
  31. ????????bDescriptorSubtype 2 (FORMAT_TYPE)
  32. ????????bFormatType 1 (FORMAT_TYPE_I)
  33. ????????bNrChannels 1
  34. ????????bSubframeSize 2
  35. ????????bBitResolution 16
  36. ????????bSamFreqType 1 Discrete
  37. ????????tSamFreq[ 0] 16000
  38. ??????Endpoint Descriptor:
  39. ????????bLength 9
  40. ????????bDescriptorType 5
  41. ????????bEndpointAddress 0x83 EP 3 IN
  42. ????????bmAttributes 5
  43. ??????????Transfer Type Isochronous
  44. ??????????Synch Type Asynchronous
  45. ??????????Usage Type Data
  46. ????????wMaxPacketSize 0x0020 1x 32 bytes
  47. ????????bInterval 4
  48. ????????bRefresh 0
  49. ????????bSynchAddress 0
  50. ????????AudioControl Endpoint Descriptor:
  51. ??????????bLength 7
  52. ??????????bDescriptorType 37
  53. ??????????bDescriptorSubtype 1 (EP_GENERAL)
  54. ??????????bmAttributes 0x01
  55. ????????????Sampling Frequency
  56. ??????????bLockDelayUnits 0 Undefined
  57. ??????????wLockDelay 0 Undefined
  58. /************************************************************************/
  59. ????Interface Descriptor:
  60. ??????bLength 9
  61. ??????bDescriptorType 4
  62. ??????bInterfaceNumber 3
  63. ??????bAlternateSetting 2
  64. ??????bNumEndpoints 1
  65. ??????bInterfaceClass 1
  66. ??????bInterfaceSubClass 2
  67. ??????bInterfaceProtocol 0
  68. ??????iInterface 0
  69. ??????AudioStreaming Interface Descriptor:
  70. ????????bLength 7
  71. ????????bDescriptorType 36
  72. ????????bDescriptorSubtype 1 (AS_GENERAL)
  73. ????????bTerminalLink 3
  74. ????????bDelay 1 frames
  75. ????????wFormatTag 1 PCM
  76. ??????AudioStreaming Interface Descriptor:
  77. ????????bLength 11
  78. ????????bDescriptorType 36
  79. ????????bDescriptorSubtype 2 (FORMAT_TYPE)
  80. ????????bFormatType 1 (FORMAT_TYPE_I)
  81. ????????bNrChannels 1
  82. ????????bSubframeSize 2
  83. ????????bBitResolution 16
  84. ????????bSamFreqType 1 Discrete
  85. ????????tSamFreq[ 0] 48000
  86. ??????Endpoint Descriptor:
  87. ????????bLength 9
  88. ????????bDescriptorType 5
  89. ????????bEndpointAddress 0x83 EP 3 IN
  90. ????????bmAttributes 5
  91. ??????????Transfer Type Isochronous
  92. ??????????Synch Type Asynchronous
  93. ??????????Usage Type Data
  94. ????????wMaxPacketSize 0x0060 1x 96 bytes
  95. ????????bInterval 4
  96. ????????bRefresh 0
  97. ????????bSynchAddress 0
  98. ????????AudioControl Endpoint Descriptor:
  99. ??????????bLength 7
  100. ??????????bDescriptorType 37
  101. ??????????bDescriptorSubtype 1 (EP_GENERAL)
  102. ??????????bmAttributes 0x01
  103. ????????????Sampling Frequency
  104. ??????????bLockDelayUnits 0 Undefined
  105. ??????????wLockDelay 0 Undefined
???
? ? 看到描述符,順便插一句,對照端點大小計算一下,藍色字體,這款USB-AUDIO只支持16K和48K的16bit單聲道錄音,拿16K為例,1s數據量應該是16K*16/8=32KB,對應于端點的大小32B*1000=32KB,也就是說全速模式下應該是每幀(1ms)請求一次才對,而對于圖中的紅色字體,說明的意思是全速模式下的ISO傳輸請求間隔參數是4,對應我們的USB的控制器,意思即為每8幀才發起一次ISO請求,抓包驗證確實如此,這一點確實比較詭異,問題可能就出在這里:



????? 但是對于幾乎同樣的驅動版本,我們611的是2.6.32.9而arm的是2.6.32.2,其sound目錄下的usbaudio.c基本是相同的,描述符又是相同的,所以上層獲取描述符進行的配置應該也是相同的,唯一的區別就是USB的控制器,我們611的是musb,而arm的是OHCI,我們musb對這個bInterval的配置是


因此驅動固然是8幀請求一次。我在OHCI的控制器中未找到類似的寄存器,猜想可能是OHCI默認的就是ISO傳輸每一幀會保證一次,其抓包圖如下:



所以只好強制去修改musb的驅動配置,/drivers/usb/musb/musb_host.c

  1. 2013 /* precompute rxtype/txtype/type0 register */
  2. 2014 type_reg = (qh->type << 4) | qh->epnum;
  3. 2015 switch (urb->dev->speed) {
  4. 2016 case USB_SPEED_LOW:
  5. 2017 type_reg |= 0xc0;
  6. 2018 break;
  7. 2019 case USB_SPEED_FULL:
  8. 2020 type_reg |= 0x80;
  9. 2021 break;
  10. 2022 default:
  11. 2023 type_reg |= 0x40;
  12. 2024 }
  13. 2025 qh->type_reg = type_reg;
  14. 2026
  15. 2027 /* Precompute RXINTERVAL/TXINTERVAL register */
  16. 2028 switch (qh->type) {
  17. 2029 case USB_ENDPOINT_XFER_INT:
  18. 2030 /*
  19. 2031 * Full/low speeds use the linear encoding,
  20. 2032 * high speed uses the logarithmic encoding.
  21. 2033 */
  22. 2034 if (urb->dev->speed <= USB_SPEED_FULL) {
  23. 2035 interval = max_t(u8, epd->bInterval, 1);
  24. 2036 break;
  25. 2037 }
  26. 2038 /* FALLTHROUGH */
  27. 2039 case USB_ENDPOINT_XFER_ISOC:
  28. 2040 /* ISO always uses logarithmic encoding */
  29. 2041 //interval = min_t(u8, epd->bInterval, 16);
  30. 2042 interval = min_t(u8, epd->bInterval, 1); //JGF
  31. 2043 break;
  32. 2044 default:

這樣USB就是每幀請求一次,同樣的代碼,效果和2440的也一樣了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253387.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讓input變成不可編輯狀態的方法

有時候&#xff0c;我們希望表單中的文本框是只讀的&#xff0c;讓用戶不能修改其中的信息&#xff0c;如使<input type"text" name"input1" value"中國"> 的內容&#xff0c;"中國"兩個字不可以修改。實現的方式歸納一下&#…

npm run dev 在本地調試出現跨域問題解決方法

npm run dev 在本地調試出現跨域問題 在localhost:8080調試時會出現跨域問題&#xff0c;如圖&#xff1a; 我的項目是用webpack作為前端自動化構建工具&#xff0c;可以在webpack-dev-server中配置跨域。webpack-dev-server是一個小型的nodejs服務器&#xff0c;是基于express…

alsa聲音編程介紹

http://blog.csdn.net/q553716434/article/details/7881552 period(周期):硬件中中斷間的間隔時間。它表示輸入延時。 聲卡接口中有一個指針來指示聲卡硬件緩存區中當前的讀寫位置。只要接口在運行&#xff0c;這個指針將循環地指向緩存區中的某個位置。 frame size sizeof(o…

五、python模塊以及包

模塊&#xff1a;編寫的別的程序中重用一些代碼。 1 模塊的寫法&#xff1a; 創建一個.py文件&#xff0c;該文件中包含函數與變量。使用撰寫python解釋器本身的本地語言來編寫模塊。比如使用C代碼編寫python模塊&#xff0c;并且在編譯后&#xff0c;可以通過標準的python解釋…

jeecg選擇按鈕帶入其他單據值

前端的標簽 <input class"inputxt" id"fshimian" name"fshimian" ignore"ignore" datatype"*" value"${shizhePage.fshimian}" /> <t:choose hiddenName"fshimian" hiddenid"fname"…

alsa編程

alsa 編程 分類&#xff1a; linux 2012-08-18 20:13 124人閱讀 評論(0) 收藏 舉報 編程parametersbufferloopsaccessplayback轉載自&#xff1a;http://blog.csdn.net/spygg/article/details/7824750 ALSA(Advanced Linux Sound Architecture)是由內核驅動,標準的API庫和一系…

Fiddler4入門——手機抓包

一、下載工具包 百度搜索”fiddler 下載“ &#xff0c;安裝最新版本 下載的軟件安裝包為“fiddler_4.6.20171.26113_setup.exe”格式&#xff0c;雙擊安裝。安裝成功&#xff0c;在“開始”-“所有程序”&#xff0c;就會看見這樣的圖標&#xff0c;若是常用的話&#xff0c;也…

Node.js Performance

https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/轉載于:https://www.cnblogs.com/skating/p/7544838.html

(五)DOM4j進行XML文件的解析及生成

DOM4j本身還是需要使用SAX建立解析器&#xff0c;然后通過文檔依次找到根節點&#xff0c;再通過根節點查找每一個節點的內容. 1.寫操作 import java.io.File;import java.io.FileOutputStream;import java.util.Iterator; import org.dom4j.Document;import org.dom4j.Documen…

Linux系統基礎.作業

要求以root用戶登錄系統&#xff0c;右擊桌面打開終端&#xff0c;查看當前登陸Linux系統所使用的用戶名 查看哪些用戶在系統上工作 修改當前時間為2018年8月26號11:28 查看2015年10月份日歷 使用兩種方法查看ls命令的使用說明 清除屏幕 ctrlL使用“useradd tom”命令新建tom用…

Alsa中PCM參數設置

分類&#xff1a; LINUX 1) PCM設備的句柄.2) 指定同時可供回放或截獲的PCM流的方向3) 提供一些關于我們想要使用的設置選項的信息,比如緩沖區大小,采樣率,PCM數據格式等4) 檢查硬件是否支持設置選項.4.1) 初始化PCM變量4.2) 分配hwparams結構4.3) 打開PCM設備4.4) 以聲卡的全部…

java5

java基礎&#xff08;五&#xff09;命名規則&#xff1a; 名字中只能包含->字母、_、數字、$&#xff0c;且開頭不能為數字包名必須都小寫文件名首字母和后面英文文件單詞首字母都要大寫變量和方法名 首字母小寫&#xff0c;后面英文單詞首字母大寫java中的方法&#xff1a…

最新歷史版本 :H.265

原來對264有深入的研究&#xff0c;現在想詳細了解下265啦&#xff0c;愿265盡快廣泛的使用起來&#xff0c;人們可以享受無處不在的視覺盛宴。 H.265是ITU-T VCEG 繼H.264之后所制定的新的視頻編碼標準。H.265標準圍繞著現有的視頻編碼標準H.264&#xff0c;保留原來的某些技術…

凱撒密碼、GDP格式化輸出、99乘法表

1.愷撒密碼的編碼 sinput(請輸入明文:) print(密文為:) for i in s:print(chr(ord(i)3),end)運行結果為&#xff1a; 2.國家名稱 GDP總量&#xff08;人民幣億元&#xff09; 中國 &#xffe5;765873.4375 澳大利亞 &#xffe5; 78312.4375 &#xff08;國家名稱左對齊&am…

【BZOJ3453】XLkxc [拉格朗日插值法]

XLkxc Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss]Description 給定 k,a,n,d,p  f(i)1^k2^k3^k......i^k  g(x)f(1)f(2)f(3)....f(x)  求(g(a)g(ad)g(a2d)......g(and))mod p Input 第一行數據組數&#xff0c;(保證小于6)  以下每行四個整數 …

hive安裝

雷頓學院大數據雷頓學院大數據&#xff1a;http://www.leidun.site/hive安裝下載hivehttp://mirror.bit.edu.cn/apache/hive/下載后解壓配置命令將hive加入命令vim ~/.bash_profile添加如下命令export HIVE_HOME/usr/local/Cellar/hive/1.2.1/libexec保存文件mysql數據庫驅動cu…

JavaFX常用匯總

1. 描述備注 1.1 參考教程 博客 易百教程 JavaFX中國 1.5 安裝 a). 在線安裝e(fx)clipse插件 b). 下載安裝SceneBuilder c). eclipse重啟以后,windows->preference->javaFx->SceneBuilder executable選擇 上一步中安裝后的exe文件 2. 快速入門示例-MVC a). *.fxml文件…

Alsa驅動分析(轉)

1. Abstract 2. Introduction 3. 音頻驅動框架介紹 3.1 音頻設備的注冊 3.2 音頻驅動的注冊 3.2.1 Probe函數的調用 3.2.2 Soc_probe函數 4. 通常的使用流程的分析 4.1.1 open過程介紹 4.1.2 snd_pcm_hw_params流程分析 4.1.3 …

bzoj2744[HEOI2012]朋友圈

題目鏈接&#xff1a;bzoj2744 題目大意&#xff1a; 兩個國家看成是AB兩國&#xff0c;現在是兩個國家的描述&#xff1a; 1.A國&#xff1a;每個人都有一個友善值&#xff0c;當兩個A國人的友善值a、b&#xff0c;如果a xor b mod 21&#xff0c;那么這兩個人都是朋友&#x…

Linux之父為過去的言行道歉,宣布離開社區反思

9月17日&#xff0c;Linux 4.19-rc4發布&#xff0c;成為Linux 4.19最新的開發測試內核。這是現階段一個相當常規的內核更新&#xff0c;但令人震驚的是&#xff0c;Linux之父Linus Torvalds宣布將暫時離開內核維護社區&#xff0c;Greg Kroah-Hartman將接管接下來的Linux 4.19…