From patchwork Thu Jan 14 13:45:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?UTF-8?B?Wm9sdMOhbiBLxZF2w6Fnw7M=?= X-Patchwork-Id: 567463 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 8D48A1402E2 for ; Fri, 15 Jan 2016 01:02:51 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=ox8d6Qn6; dkim-atps=neutral Received: from localhost ([::1]:42669 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJiUD-00029t-9U for incoming@patchwork.ozlabs.org; Thu, 14 Jan 2016 09:02:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35873) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJiEg-0001p7-PJ for qemu-devel@nongnu.org; Thu, 14 Jan 2016 08:46:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJiEe-0003a3-Qw for qemu-devel@nongnu.org; Thu, 14 Jan 2016 08:46:45 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:33232) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJiEe-0003Zu-AT for qemu-devel@nongnu.org; Thu, 14 Jan 2016 08:46:44 -0500 Received: by mail-wm0-x242.google.com with SMTP id u188so43611881wmu.0 for ; Thu, 14 Jan 2016 05:46:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=RK4UDelR0YlqmNjwdE4Vx80Dn87hmwuLvAj07D/E1as=; b=ox8d6Qn6d3KBap7SKtauKj4HeLpsjN5glkrRNCSPK96/hfKbI3Fsx01F3Pg1oqZyOB rYYokxwOWFm/q6fOuwX+Sj2I4ynOgLsG3yx6TkpV+DW+QkA128hUGaGVYChzHIU/WWP/ G+VF2ZjSazYmhTB92Omw+LbDC3z2ESi9k5HHsmsy/Bvhs0uEM0sFn6KI+H/xUuB+Mtkm sMIArhbAxLTyjiVi1v8ETRR6zoNGMdIsrbG0tayNZM8DMIeuS273Pa+JwOUpaeqUDN4d IqP15MBL+CGGIXwEngqkS6cDzEXkWQp9YRtTByNRhgg8LWYz5AE7WKNBWdRXCx5uK8pL m9Ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=RK4UDelR0YlqmNjwdE4Vx80Dn87hmwuLvAj07D/E1as=; b=JQrE700hqYeKO/KOzao4qRGd44J7qcRwu7X/Muq6g392CYrOYM9R8Iljt29VHaeqMV n2FsGfQuerK3M7wHEQ4ICn9vy3/oSmyIVVaxSeLPN58HxyR1Y1jxFzfYFe13hNT883kS UBDweXr0OTGe6ZJuXFPbqL2CdzZPABMmT7LzqOOAw9Uvb3c7AoIHkwr5G413gzX2DO+g Y/i7FcWUxuYMVm3HHO/lyCchynKJuXNkbI4qLxQEJ2R7T3hjyaIlWEjZBfbf/vv8UQh9 4EoErd+P5h27OvGQqphiBDuxTlU0O2Izf60/xh0KiIE5nYxiI8wOynJ06FO3xWJzIPNp QJyQ== X-Gm-Message-State: ALoCoQnnwfC8IFcpROL+/BstWg4iBMxxRaGHf8DRe1anU/0TQiXAUVWX0We0CO0WKnHzq6FHb+NNoKOAFoXUSwVk0Bv+rf2ecg== X-Received: by 10.28.54.209 with SMTP id y78mr5357936wmh.26.1452779203833; Thu, 14 Jan 2016 05:46:43 -0800 (PST) Received: from nullptr.home.dirty-ice.org (188-143-126-18.pool.digikabel.hu. [188.143.126.18]) by smtp.gmail.com with ESMTPSA id 79sm7398061wmo.7.2016.01.14.05.46.43 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 14 Jan 2016 05:46:43 -0800 (PST) From: "=?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?=" X-Google-Original-From: =?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?= To: qemu-devel@nongnu.org Date: Thu, 14 Jan 2016 14:45:56 +0100 Message-Id: <5d585e841d670dff18984405781919933aee96f4.1452776884.git.DirtY.iCE.hu@gmail.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::242 Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH 43/51] audio: make mixeng optional X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Implementation of the previously added mixeng option. Signed-off-by: Kővágó, Zoltán --- audio/audio.c | 70 +++++++++++++++++++++++++++++++++++++++++++++----- audio/audio_template.h | 22 +++++++++++----- 2 files changed, 79 insertions(+), 13 deletions(-) diff --git a/audio/audio.c b/audio/audio.c index 7c59748..ea3219b 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -793,32 +793,46 @@ static void audio_timer (void *opaque) */ size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size) { + HWVoiceOut *hw; + if (!sw) { /* XXX: Consider options */ return size; } + hw = sw->hw; - if (!sw->hw->enabled) { + if (!hw->enabled) { dolog ("Writing to disabled voice %s\n", SW_NAME (sw)); return 0; } - return audio_pcm_sw_write(sw, buf, size); + if (hw->s->dev->out->mixeng) { + return audio_pcm_sw_write(sw, buf, size); + } else { + return hw->pcm_ops->write(hw, buf, size); + } } size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size) { + HWVoiceIn *hw; + if (!sw) { /* XXX: Consider options */ return size; } + hw = sw->hw; - if (!sw->hw->enabled) { + if (!hw->enabled) { dolog ("Reading from disabled voice %s\n", SW_NAME (sw)); return 0; } - return audio_pcm_sw_read(sw, buf, size); + if (hw->s->dev->in->mixeng) { + return audio_pcm_sw_read(sw, buf, size); + } else { + return hw->pcm_ops->read(hw, buf, size); + } } int AUD_get_buffer_size_out (SWVoiceOut *sw) @@ -1038,6 +1052,26 @@ static void audio_run_out (AudioState *s) HWVoiceOut *hw = NULL; SWVoiceOut *sw; + if (!s->dev->out->mixeng) { + while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) { + /* there is exactly 1 sw for each hw with no mixeng */ + sw = hw->sw_head.lh_first; + + if (hw->pending_disable) { + hw->enabled = 0; + hw->pending_disable = 0; + if (hw->pcm_ops->enable_out) { + hw->pcm_ops->enable_out(hw, false); + } + } + + if (sw->active) { + sw->callback.fn(sw->callback.opaque, INT_MAX); + } + } + return; + } + while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) { size_t played, live, prev_rpos, free; int nb_live, cleanup_required; @@ -1174,6 +1208,17 @@ static void audio_run_in (AudioState *s) { HWVoiceIn *hw = NULL; + if (!s->dev->in->mixeng) { + while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) { + /* there is exactly 1 sw for each hw with no mixeng */ + SWVoiceIn *sw = hw->sw_head.lh_first; + if (sw->active) { + sw->callback.fn(sw->callback.opaque, INT_MAX); + } + } + return; + } + while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) { SWVoiceIn *sw; size_t captured, min; @@ -1654,6 +1699,11 @@ CaptureVoiceOut *AUD_add_capture( s = QTAILQ_FIRST(&audio_states); } + if (!s->dev->out->mixeng) { + dolog("Can't capture with mixeng disabled\n"); + goto err0; + } + if (audio_validate_settings (as)) { dolog ("Invalid settings were passed when trying to add capture\n"); audio_print_settings (as); @@ -1811,9 +1861,13 @@ QemuOptsList qemu_audiodev_opts = { static void validate_per_direction_opts(AudiodevPerDirectionOptions *pdo, Error **errp) { + if (!pdo->has_mixeng) { + pdo->has_mixeng = true; + pdo->mixeng = true; + } if (!pdo->has_fixed_settings) { pdo->has_fixed_settings = true; - pdo->fixed_settings = true; + pdo->fixed_settings = pdo->mixeng; } if (!pdo->fixed_settings && (pdo->has_frequency || pdo->has_channels || pdo->has_format)) { @@ -1821,6 +1875,10 @@ static void validate_per_direction_opts(AudiodevPerDirectionOptions *pdo, "You can't use frequency, channels or format with fixed-settings=off"); return; } + if (!pdo->mixeng && pdo->fixed_settings) { + error_setg(errp, "You can't use fixed-settings without mixeng"); + return; + } if (!pdo->has_frequency) { pdo->has_frequency = true; @@ -1832,7 +1890,7 @@ static void validate_per_direction_opts(AudiodevPerDirectionOptions *pdo, } if (!pdo->has_voices) { pdo->has_voices = true; - pdo->voices = 1; + pdo->voices = pdo->mixeng ? 1 : INT_MAX; } if (!pdo->has_format) { pdo->has_format = true; diff --git a/audio/audio_template.h b/audio/audio_template.h index 762efea..f3cbc66 100644 --- a/audio/audio_template.h +++ b/audio/audio_template.h @@ -78,15 +78,19 @@ static void glue (audio_pcm_hw_free_resources_, TYPE) (HW *hw) static void glue(audio_pcm_hw_alloc_resources_, TYPE)(HW *hw) { - size_t samples; - if (hw->pcm_ops->glue(buffer_size_, TYPE)) { - samples = hw->pcm_ops->glue(buffer_size_, TYPE)(hw); + if (hw->s->dev->TYPE->mixeng) { + size_t samples; + if (hw->pcm_ops->glue(buffer_size_, TYPE)) { + samples = hw->pcm_ops->glue(buffer_size_, TYPE)(hw); + } else { + samples = 1024; /* todo better default */ + } + + HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample)*samples); + HWBUF->size = samples; } else { - samples = 1024; /* todo better default */ + HWBUF = NULL; } - - HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample)*samples); - HWBUF->size = samples; } static void glue (audio_pcm_sw_free_resources_, TYPE) (SW *sw) @@ -105,6 +109,10 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw) { int samples; + if (!sw->s->dev->TYPE->mixeng) { + return 0; + } + samples = ((int64_t) sw->HWBUF->size << 32) / sw->ratio; sw->buf = audio_calloc (AUDIO_FUNC, samples, sizeof (struct st_sample));