audio_dialog.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:19k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #define __STDC_LIMIT_MACROS
  23. #include "mp4live.h"
  24. #include "mp4live_gui.h"
  25. #include "audio_oss_source.h"
  26. #include "audio_lame.h"
  27. static GtkWidget *dialog;
  28. static char* source_type;
  29. static char* source_name;
  30. static GtkWidget *source_combo;
  31. static GtkWidget *source_entry;
  32. static GtkWidget *source_list;
  33. static bool source_modified;
  34. static GtkWidget *browse_button;
  35. static GtkWidget *input_label;
  36. static GtkWidget *input_menu;
  37. static GtkWidget *track_label;
  38. static GtkWidget *track_menu;
  39. static GtkWidget *channel_menu;
  40. static GtkWidget *encoding_menu;
  41. static GtkWidget *sampling_rate_menu;
  42. static GtkWidget *bit_rate_menu;
  43. static CAudioCapabilities* pAudioCaps;
  44. static char* inputValues[] = {
  45. "cd", "line", "mic", "mix"
  46. };
  47. static char* inputNames[] = {
  48. "CD", "Line In", "Microphone", "Via Mixer"
  49. };
  50. static u_int8_t inputIndex;
  51. static u_int32_t trackIndex;
  52. static u_int32_t trackNumber; // how many tracks total
  53. static u_int32_t* trackValues = NULL;
  54. static u_int8_t channelValues[] = {
  55. 1, 2
  56. };
  57. static char* channelNames[] = {
  58. "1 - Mono", "2 - Stereo"
  59. };
  60. static u_int8_t channelIndex;
  61. static char* encodingNames[] = {
  62. "MP3", "AAC"
  63. };
  64. static u_int8_t encodingIndex;
  65. static char** samplingRateNames = NULL;
  66. static u_int32_t* samplingRateValues = NULL;
  67. static u_int8_t samplingRateIndex;
  68. static u_int8_t samplingRateNumber = 0; // how many sampling rates
  69. // union of valid sampling rates for MP3 and AAC
  70. static const u_int32_t samplingRateAllValues[] = {
  71. 7350, 8000, 11025, 12000, 16000, 22050, 
  72. 24000, 32000, 44100, 48000, 64000, 88200, 96000
  73. };
  74. // union of valid bit rates for MP3 and AAC
  75. static const u_int16_t bitRateAllValues[] = {
  76. 8, 16, 24, 32, 40, 48, 
  77. 56, 64, 80, 96, 112, 128, 
  78. 144, 160, 192, 224, 256, 320
  79. };
  80. static const u_int8_t bitRateAllNumber =
  81. sizeof(bitRateAllValues) / sizeof(u_int16_t);
  82. static u_int16_t bitRateValues[bitRateAllNumber];
  83. static char* bitRateNames[bitRateAllNumber];
  84. static u_int8_t bitRateIndex;
  85. static u_int8_t bitRateNumber = 0; // how many bit rates
  86. // forward function declarations
  87. static void CreateSamplingRateMenu(CAudioCapabilities* pNewAudioCaps);
  88. static void CreateBitRateMenu();
  89. static void SetSamplingRate(u_int32_t samplingRate);
  90. static void on_destroy_dialog (GtkWidget *widget, gpointer *data)
  91. {
  92. gtk_grab_remove(dialog);
  93. gtk_widget_destroy(dialog);
  94. dialog = NULL;
  95. static bool SourceIsDevice()
  96. {
  97. const char* source_name =
  98. gtk_entry_get_text(GTK_ENTRY(source_entry));
  99. return !strncmp(source_name, "/dev/", 5);
  100. }
  101. static void ShowSourceSpecificSettings()
  102. {
  103. if (SourceIsDevice()) {
  104. gtk_widget_show(input_label);
  105. gtk_widget_show(input_menu);
  106. gtk_widget_hide(track_label);
  107. gtk_widget_hide(track_menu);
  108. } else {
  109. gtk_widget_hide(input_label);
  110. gtk_widget_hide(input_menu);
  111. gtk_widget_show(track_label);
  112. gtk_widget_show(track_menu);
  113. }
  114. }
  115. static void SourceOssDevice()
  116. {
  117. char *newSourceName =
  118. gtk_entry_get_text(GTK_ENTRY(source_entry));
  119. // don't probe the already open device!
  120. if (!strcmp(newSourceName, 
  121.   MyConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME))) {
  122. return;
  123. }
  124. // probe new device
  125. CAudioCapabilities* pNewAudioCaps = 
  126. new CAudioCapabilities(newSourceName);
  127. // check for errors
  128. if (!pNewAudioCaps->IsValid()) {
  129. ShowMessage("Change Audio Source",
  130. "Specified audio source can't be opened, check name");
  131. delete pNewAudioCaps;
  132. return;
  133. }
  134. if (pAudioCaps != MyConfig->m_audioCapabilities) {
  135. delete pAudioCaps;
  136. }
  137. pAudioCaps = pNewAudioCaps;
  138. // change sampling rate menu
  139. CreateSamplingRateMenu(pNewAudioCaps);
  140. // change bit rate menu
  141. CreateBitRateMenu();
  142. }
  143. static void ChangeSource()
  144. {
  145. char* new_source_name =
  146. gtk_entry_get_text(GTK_ENTRY(source_entry));
  147. if (!strcmp(new_source_name, source_name)) {
  148. source_modified = false;
  149. return;
  150. }
  151. free(source_name);
  152. source_name = stralloc(new_source_name);
  153. if (SourceIsDevice()) {
  154. source_type = AUDIO_SOURCE_OSS;
  155. SourceOssDevice();
  156. } else {
  157. if (pAudioCaps != MyConfig->m_audioCapabilities) {
  158. delete pAudioCaps;
  159. }
  160. pAudioCaps = NULL;
  161. if (IsUrl(source_name)) {
  162. source_type = URL_SOURCE;
  163. } else {
  164. if (access(source_name, R_OK) != 0) {
  165. ShowMessage("Change Audio Source",
  166. "Specified audio source can't be opened, check name");
  167. }
  168. source_type = FILE_SOURCE;
  169. }
  170. }
  171. track_menu = CreateTrackMenu(
  172. track_menu,
  173. 'A',
  174. gtk_entry_get_text(GTK_ENTRY(source_entry)),
  175. &trackIndex,
  176. &trackNumber,
  177. &trackValues);
  178. ShowSourceSpecificSettings();
  179. source_modified = false;
  180. }
  181. static void on_source_browse_button (GtkWidget *widget, gpointer *data)
  182. {
  183. FileBrowser(source_entry, GTK_SIGNAL_FUNC(ChangeSource));
  184. }
  185. static void on_source_entry_changed(GtkWidget *widget, gpointer *data)
  186. {
  187. if (widget == source_entry) {
  188. source_modified = true;
  189. }
  190. }
  191. static void on_source_leave(GtkWidget *widget, gpointer *data)
  192. {
  193. if (source_modified) {
  194. ChangeSource();
  195. }
  196. }
  197. static void on_source_list_changed(GtkWidget *widget, gpointer *data)
  198. {
  199. if (widget == source_list) {
  200. ChangeSource();
  201. }
  202. }
  203. static void on_input_menu_activate (GtkWidget *widget, gpointer data)
  204. {
  205. inputIndex = (unsigned int)data & 0xFF;
  206. }
  207. static void on_channel_menu_activate (GtkWidget *widget, gpointer data)
  208. {
  209. channelIndex = (unsigned int)data & 0xFF;
  210. }
  211. static void on_encoding_menu_activate (GtkWidget *widget, gpointer data)
  212. {
  213. encodingIndex = (unsigned int)data & 0xFF;
  214. CreateSamplingRateMenu(pAudioCaps);
  215. CreateBitRateMenu();
  216. }
  217. static void on_sampling_rate_menu_activate (GtkWidget *widget, gpointer data)
  218. {
  219. samplingRateIndex = (unsigned int)data & 0xFF;
  220. CreateBitRateMenu();
  221. }
  222. static void on_bit_rate_menu_activate (GtkWidget *widget, gpointer data)
  223. {
  224. bitRateIndex = (unsigned int)data & 0xFF;
  225. }
  226. void CreateSamplingRateMenu(CAudioCapabilities* pNewAudioCaps)
  227. {
  228. // remember current sampling rate
  229. u_int32_t oldSamplingRate = 0;
  230. if (samplingRateValues) {
  231. oldSamplingRate = samplingRateValues[samplingRateIndex];
  232. }
  233. // invalidate index, will fix up below
  234. samplingRateIndex = 255;
  235. u_int8_t maxSamplingRateNumber;
  236. const u_int32_t* samplingRates = NULL;
  237. if (pNewAudioCaps) {
  238. maxSamplingRateNumber = pNewAudioCaps->m_numSamplingRates;
  239. samplingRates = &pNewAudioCaps->m_samplingRates[0];
  240. } else {
  241. maxSamplingRateNumber = 
  242. sizeof(samplingRateAllValues) / sizeof(u_int32_t);
  243. samplingRates = &samplingRateAllValues[0];
  244. }
  245. // create new menu item names and values
  246. char** newSamplingRateNames = 
  247. (char**)malloc(sizeof(char*) * maxSamplingRateNumber);
  248. u_int32_t* newSamplingRateValues =
  249. (u_int32_t*)malloc(sizeof(u_int32_t) * maxSamplingRateNumber);
  250. u_int8_t i;
  251. u_int8_t newSamplingRateNumber = 0;
  252. for (i = 0; i < maxSamplingRateNumber; i++) {
  253. // MP3 can't use all the possible sampling rates
  254. if (encodingIndex == 0) {
  255. // skip the ones it can't handle
  256. // MP3 can't handle anything less than 8000
  257. // LAME MP3 encoder has additional lower bound at 16000
  258. if (samplingRates[i] < 16000 || samplingRates[i] > 48000) {
  259. continue;
  260. }
  261. }
  262. char buf[64];
  263. snprintf(buf, sizeof(buf), "%u", samplingRates[i]);
  264. newSamplingRateNames[newSamplingRateNumber] = 
  265. stralloc(buf);
  266. newSamplingRateValues[newSamplingRateNumber] = 
  267. samplingRates[i];
  268. if (oldSamplingRate == newSamplingRateValues[newSamplingRateNumber]) {
  269. samplingRateIndex = newSamplingRateNumber;
  270. }
  271. newSamplingRateNumber++;
  272. }
  273. if (samplingRateIndex >= newSamplingRateNumber) {
  274. samplingRateIndex = newSamplingRateNumber - 1; 
  275. }
  276. // (re)create the menu
  277. sampling_rate_menu = CreateOptionMenu(
  278. sampling_rate_menu,
  279. newSamplingRateNames, 
  280. newSamplingRateNumber,
  281. samplingRateIndex,
  282. GTK_SIGNAL_FUNC(on_sampling_rate_menu_activate));
  283. // free up old names
  284. for (i = 0; i < samplingRateNumber; i++) {
  285. free(samplingRateNames[i]);
  286. }
  287. free(samplingRateNames);
  288. samplingRateNames = newSamplingRateNames;
  289. samplingRateValues = newSamplingRateValues;
  290. samplingRateNumber = newSamplingRateNumber;
  291. }
  292. static void SetSamplingRate(u_int32_t samplingRate)
  293. {
  294. u_int8_t i;
  295. for (i = 0; i < samplingRateNumber; i++) {
  296. if (samplingRate == samplingRateValues[i]) {
  297. samplingRateIndex = i;
  298. break;
  299. }
  300. }
  301. if (i == samplingRateNumber) {
  302. debug_message("invalid sampling rate %un", samplingRate);
  303. }
  304. gtk_option_menu_set_history(
  305. GTK_OPTION_MENU(sampling_rate_menu), samplingRateIndex);
  306. }
  307. void CreateBitRateMenu()
  308. {
  309. u_int8_t i;
  310. u_int16_t oldBitRate = bitRateValues[bitRateIndex];
  311. u_int32_t samplingRate = samplingRateValues[samplingRateIndex];
  312. // free up old names
  313. for (i = 0; i < bitRateNumber; i++) {
  314. free(bitRateNames[i]);
  315. bitRateNames[i] = NULL;
  316. }
  317. bitRateNumber = 0;
  318. // make current bitrate index invalid, will fixup below
  319. bitRateIndex = 255;
  320. // for all possible bitrates
  321. for (i = 0; i < bitRateAllNumber; i++) {
  322. // MP3 can't use all the possible bit rates
  323. // LAME imposes additional constraints
  324. if (encodingIndex == 0) {
  325. if (samplingRate >= 32000) {
  326. // MPEG-1
  327. if (bitRateAllValues[i] < 40
  328.   || bitRateAllValues[i] == 144) {
  329. continue;
  330. }
  331. if (samplingRate >= 44100 && bitRateAllValues[i] < 56) {
  332. continue;
  333. }
  334. if (samplingRate >= 48000 && bitRateAllValues[i] < 64) {
  335. continue;
  336. }
  337. } else {
  338. // MPEG-2 or MPEG-2.5
  339. if (samplingRate > 16000) {
  340. if (bitRateAllValues[i] < 32) {
  341. continue;
  342. }
  343. }
  344. if (bitRateAllValues[i] > 160) {
  345. continue;
  346. }
  347. }
  348. }
  349. char buf[64];
  350. snprintf(buf, sizeof(buf), "%u",
  351. bitRateAllValues[i]);
  352. bitRateNames[bitRateNumber] = stralloc(buf);
  353. bitRateValues[bitRateNumber] = bitRateAllValues[i];
  354. // preserve user's current choice if we can
  355. if (oldBitRate == bitRateValues[bitRateNumber]) {
  356. bitRateIndex = bitRateNumber;
  357. }
  358. bitRateNumber++;
  359. }
  360. if (bitRateIndex >= bitRateNumber) {
  361. bitRateIndex = bitRateNumber - 1; 
  362. }
  363. // (re)create the menu
  364. bit_rate_menu = CreateOptionMenu(
  365. bit_rate_menu,
  366. bitRateNames, 
  367. bitRateNumber,
  368. bitRateIndex,
  369. GTK_SIGNAL_FUNC(on_bit_rate_menu_activate));
  370. }
  371. static bool ValidateAndSave(void)
  372. {
  373. // if source has been modified
  374. if (source_modified) {
  375. // validate it
  376. ChangeSource();
  377. // can't validate
  378. if (source_modified) {
  379. return false;
  380. }
  381. }
  382. // copy new values to config
  383. MyConfig->SetStringValue(CONFIG_AUDIO_SOURCE_TYPE,
  384. source_type);
  385. MyConfig->SetStringValue(CONFIG_AUDIO_SOURCE_NAME,
  386. gtk_entry_get_text(GTK_ENTRY(source_entry)));
  387. MyConfig->UpdateFileHistory(
  388. gtk_entry_get_text(GTK_ENTRY(source_entry)));
  389. if (MyConfig->m_audioCapabilities != pAudioCaps) {
  390. delete MyConfig->m_audioCapabilities;
  391. MyConfig->m_audioCapabilities = pAudioCaps;
  392. }
  393. MyConfig->SetStringValue(CONFIG_AUDIO_INPUT_NAME,
  394. inputValues[inputIndex]);
  395. MyConfig->SetIntegerValue(CONFIG_AUDIO_SOURCE_TRACK,
  396. trackValues ? trackValues[trackIndex] : 0);
  397. MyConfig->SetIntegerValue(CONFIG_AUDIO_CHANNELS, 
  398. channelValues[channelIndex]);
  399. if (encodingIndex == 1) {
  400. MyConfig->SetStringValue(CONFIG_AUDIO_ENCODING, AUDIO_ENCODING_AAC);
  401. MyConfig->SetStringValue(CONFIG_AUDIO_ENCODER, AUDIO_ENCODER_FAAC);
  402. } else {
  403. MyConfig->SetStringValue(CONFIG_AUDIO_ENCODING, AUDIO_ENCODING_MP3);
  404. MyConfig->SetStringValue(CONFIG_AUDIO_ENCODER, AUDIO_ENCODER_LAME);
  405. }
  406. MyConfig->SetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE, 
  407. samplingRateValues[samplingRateIndex]);
  408. MyConfig->SetIntegerValue(CONFIG_AUDIO_BIT_RATE,
  409. bitRateValues[bitRateIndex]);
  410. MyConfig->Update();
  411. DisplayAudioSettings();  // display settings in main window
  412. DisplayStatusSettings();  
  413. return true;
  414. }
  415. static void on_ok_button (GtkWidget *widget, gpointer *data)
  416. {
  417. // check and save values
  418. if (!ValidateAndSave()) {
  419. return;
  420. }
  421.     on_destroy_dialog(NULL, NULL);
  422. }
  423. static void on_cancel_button (GtkWidget *widget, gpointer *data)
  424. {
  425. on_destroy_dialog(NULL, NULL);
  426. }
  427. void CreateAudioDialog (void) 
  428. {
  429. GtkWidget* hbox;
  430. GtkWidget* vbox;
  431. GtkWidget* hbox2;
  432. GtkWidget* label;
  433. GtkWidget* button;
  434. pAudioCaps = MyConfig->m_audioCapabilities;
  435. dialog = gtk_dialog_new();
  436. gtk_signal_connect(GTK_OBJECT(dialog),
  437. "destroy",
  438. GTK_SIGNAL_FUNC(on_destroy_dialog),
  439. &dialog);
  440. gtk_window_set_title(GTK_WINDOW(dialog), "Audio Settings");
  441. hbox = gtk_hbox_new(FALSE, 1);
  442. gtk_widget_show(hbox);
  443. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
  444. FALSE, FALSE, 5);
  445. vbox = gtk_vbox_new(TRUE, 1);
  446. gtk_widget_show(vbox);
  447. gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
  448. label = gtk_label_new(" Source:");
  449. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  450. gtk_widget_show(label);
  451. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  452. input_label = gtk_label_new("   Input Port:");
  453. gtk_misc_set_alignment(GTK_MISC(input_label), 0.0, 0.5);
  454. gtk_box_pack_start(GTK_BOX(vbox), input_label, FALSE, FALSE, 0);
  455. track_label = gtk_label_new("   Track:");
  456. gtk_misc_set_alignment(GTK_MISC(track_label), 0.0, 0.5);
  457. gtk_box_pack_start(GTK_BOX(vbox), track_label, FALSE, FALSE, 0);
  458. label = gtk_label_new(" Output:");
  459. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  460. gtk_widget_show(label);
  461. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  462. label = gtk_label_new("   Encoding :");
  463. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  464. gtk_widget_show(label);
  465. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  466. label = gtk_label_new("   Channels:");
  467. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  468. gtk_widget_show(label);
  469. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  470. label = gtk_label_new("   Sampling Rate (Hz):");
  471. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  472. gtk_widget_show(label);
  473. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  474. label = gtk_label_new("   Bit Rate (kbps):");
  475. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  476. gtk_widget_show(label);
  477. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  478. vbox = gtk_vbox_new(TRUE, 1);
  479. gtk_widget_show(vbox);
  480. gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5);
  481. hbox2 = gtk_hbox_new(FALSE, 1);
  482. gtk_widget_show(hbox2);
  483. gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
  484. source_type = MyConfig->GetStringValue(CONFIG_AUDIO_SOURCE_TYPE);
  485. // source entry
  486. free(source_name);
  487. source_name =
  488. stralloc(MyConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME));
  489. source_modified = false;
  490. source_combo = CreateFileCombo(source_name);
  491. source_entry = GTK_COMBO(source_combo)->entry;
  492. SetEntryValidator(GTK_OBJECT(source_entry),
  493. GTK_SIGNAL_FUNC(on_source_entry_changed),
  494. GTK_SIGNAL_FUNC(on_source_leave));
  495. source_list = GTK_COMBO(source_combo)->list;
  496. gtk_signal_connect(GTK_OBJECT(source_list), "select_child",
  497. GTK_SIGNAL_FUNC(on_source_list_changed), NULL);
  498. gtk_widget_show(source_combo);
  499. gtk_box_pack_start(GTK_BOX(hbox2), source_combo, TRUE, TRUE, 0);
  500. // browse button
  501. browse_button = gtk_button_new_with_label(" Browse... ");
  502. gtk_signal_connect(GTK_OBJECT(browse_button),
  503.  "clicked",
  504.  GTK_SIGNAL_FUNC(on_source_browse_button),
  505.  NULL);
  506. gtk_widget_show(browse_button);
  507. gtk_box_pack_start(GTK_BOX(hbox2), browse_button, FALSE, FALSE, 5);
  508. // input menu
  509. inputIndex = 0;
  510. for (u_int8_t i = 0; i < sizeof(inputValues) / sizeof(u_int8_t); i++) {
  511. if (!strcasecmp(MyConfig->GetStringValue(CONFIG_AUDIO_INPUT_NAME),
  512.   inputValues[i])) {
  513. inputIndex = i;
  514. break;
  515. }
  516. }
  517. input_menu = CreateOptionMenu (NULL,
  518. inputNames, 
  519. sizeof(inputNames) / sizeof(char*),
  520. inputIndex,
  521. GTK_SIGNAL_FUNC(on_input_menu_activate));
  522. gtk_box_pack_start(GTK_BOX(vbox), input_menu, TRUE, TRUE, 0);
  523. // track menu
  524. track_menu = NULL;
  525. track_menu = CreateTrackMenu(
  526. track_menu,
  527. 'A',
  528. gtk_entry_get_text(GTK_ENTRY(source_entry)),
  529. &trackIndex,
  530. &trackNumber,
  531. &trackValues);
  532. trackIndex = 0; 
  533. for (u_int8_t i = 0; i < trackNumber; i++) {
  534. if (MyConfig->GetIntegerValue(CONFIG_AUDIO_SOURCE_TRACK)
  535.    == trackValues[i]) {
  536. trackIndex = i;
  537. break;
  538. }
  539. }
  540. gtk_box_pack_start(GTK_BOX(vbox), track_menu, FALSE, FALSE, 0);
  541. // spacer
  542. label = gtk_label_new(" ");
  543. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  544. gtk_widget_show(label);
  545. gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  546. if (!strcasecmp(MyConfig->GetStringValue(CONFIG_AUDIO_ENCODING),
  547.   AUDIO_ENCODING_AAC)) {
  548. encodingIndex = 1;
  549. } else {
  550. encodingIndex = 0;
  551. }
  552. encoding_menu = CreateOptionMenu (NULL,
  553. encodingNames, 
  554. sizeof(encodingNames) / sizeof(char*),
  555. encodingIndex,
  556. GTK_SIGNAL_FUNC(on_encoding_menu_activate));
  557. gtk_box_pack_start(GTK_BOX(vbox), encoding_menu, TRUE, TRUE, 0);
  558. // channel menu
  559. channelIndex = 0;
  560. for (u_int8_t i = 0; i < sizeof(channelValues) / sizeof(u_int8_t); i++) {
  561. if (MyConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS)
  562.   == channelValues[i]) {
  563. channelIndex = i;
  564. break;
  565. }
  566. }
  567. channel_menu = CreateOptionMenu (NULL,
  568. channelNames, 
  569. sizeof(channelNames) / sizeof(char*),
  570. channelIndex,
  571. GTK_SIGNAL_FUNC(on_channel_menu_activate));
  572. gtk_box_pack_start(GTK_BOX(vbox), channel_menu, TRUE, TRUE, 0);
  573. sampling_rate_menu = NULL;
  574. CreateSamplingRateMenu(pAudioCaps);
  575. gtk_box_pack_start(GTK_BOX(vbox), sampling_rate_menu, TRUE, TRUE, 0);
  576. // set sampling rate value based on MyConfig
  577. SetSamplingRate(MyConfig->GetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE));
  578. bit_rate_menu = NULL;
  579. CreateBitRateMenu();
  580. gtk_box_pack_start(GTK_BOX(vbox), bit_rate_menu, TRUE, TRUE, 0);
  581. // set bit rate value based on MyConfig
  582. for (u_int8_t i = 0; i < bitRateNumber; i++) {
  583. if (MyConfig->GetIntegerValue(CONFIG_AUDIO_BIT_RATE)
  584.   == bitRateValues[i]) {
  585. bitRateIndex = i;
  586. break;
  587. }
  588. }
  589. gtk_option_menu_set_history(
  590. GTK_OPTION_MENU(bit_rate_menu), bitRateIndex);
  591. // Add standard buttons at bottom
  592. button = AddButtonToDialog(dialog,
  593. " OK ", 
  594. GTK_SIGNAL_FUNC(on_ok_button));
  595. GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
  596. AddButtonToDialog(dialog,
  597. " Cancel ", 
  598. GTK_SIGNAL_FUNC(on_cancel_button));
  599. ShowSourceSpecificSettings();
  600. gtk_widget_show(dialog);
  601. }
  602. /* end audio_dialog.cpp */