xref: /qemu/audio/audio-hmp-cmds.c (revision 32cad1ffb81dcecf6f4a8af56d6e5892682839b1)
1  /*
2   * HMP commands related to audio backends
3   *
4   * Copyright (c) 2003-2004 Fabrice Bellard
5   *
6   * Permission is hereby granted, free of charge, to any person obtaining a copy
7   * of this software and associated documentation files (the "Software"), to deal
8   * in the Software without restriction, including without limitation the rights
9   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   * copies of the Software, and to permit persons to whom the Software is
11   * furnished to do so, subject to the following conditions:
12   *
13   * The above copyright notice and this permission notice shall be included in
14   * all copies or substantial portions of the Software.
15   *
16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   * THE SOFTWARE.
23   */
24  
25  #include "qemu/osdep.h"
26  #include "audio/audio.h"
27  #include "monitor/hmp.h"
28  #include "monitor/monitor.h"
29  #include "qapi/error.h"
30  #include "qapi/qmp/qdict.h"
31  
32  static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
33  
34  void hmp_info_capture(Monitor *mon, const QDict *qdict)
35  {
36      int i;
37      CaptureState *s;
38  
39      for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
40          monitor_printf(mon, "[%d]: ", i);
41          s->ops.info (s->opaque);
42      }
43  }
44  
45  void hmp_stopcapture(Monitor *mon, const QDict *qdict)
46  {
47      int i;
48      int n = qdict_get_int(qdict, "n");
49      CaptureState *s;
50  
51      for (s = capture_head.lh_first, i = 0; s; s = s->entries.le_next, ++i) {
52          if (i == n) {
53              s->ops.destroy (s->opaque);
54              QLIST_REMOVE (s, entries);
55              g_free (s);
56              return;
57          }
58      }
59  }
60  
61  void hmp_wavcapture(Monitor *mon, const QDict *qdict)
62  {
63      const char *path = qdict_get_str(qdict, "path");
64      int freq = qdict_get_try_int(qdict, "freq", 44100);
65      int bits = qdict_get_try_int(qdict, "bits", 16);
66      int nchannels = qdict_get_try_int(qdict, "nchannels", 2);
67      const char *audiodev = qdict_get_str(qdict, "audiodev");
68      CaptureState *s;
69      Error *local_err = NULL;
70      AudioState *as = audio_state_by_name(audiodev, &local_err);
71  
72      if (!as) {
73          error_report_err(local_err);
74          return;
75      }
76  
77      s = g_malloc0 (sizeof (*s));
78  
79      if (wav_start_capture(as, s, path, freq, bits, nchannels)) {
80          monitor_printf(mon, "Failed to add wave capture\n");
81          g_free (s);
82          return;
83      }
84      QLIST_INSERT_HEAD (&capture_head, s, entries);
85  }
86