| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <fbl/intrusive_double_list.h> |
| #include <fbl/ref_ptr.h> |
| #include <fbl/slab_allocator.h> |
| #include <fbl/unique_ptr.h> |
| |
| #include <dispatcher-pool/dispatcher-channel.h> |
| #include <intel-hda/utils/codec-commands.h> |
| #include <intel-hda/utils/intel-hda-proto.h> |
| |
| #include <utility> |
| |
| namespace audio { |
| namespace intel_hda { |
| |
| class IntelHDACodec; |
| |
| class CodecCmdJob; |
| using CodecCmdJobAllocTraits = fbl::StaticSlabAllocatorTraits<fbl::unique_ptr<CodecCmdJob>>; |
| using CodecCmdJobAllocator = fbl::SlabAllocator<CodecCmdJobAllocTraits>; |
| |
| class CodecCmdJob : public fbl::DoublyLinkedListable<fbl::unique_ptr<CodecCmdJob>>, |
| public fbl::SlabAllocated<CodecCmdJobAllocTraits> { |
| public: |
| CodecCommand command() const { return cmd_; } |
| uint8_t codec_id() const { return cmd_.codec_id(); } |
| uint16_t nid() const { return cmd_.nid(); } |
| CodecVerb verb() const { return cmd_.verb(); } |
| |
| const fbl::RefPtr<dispatcher::Channel>& response_channel() const { return response_channel_; } |
| zx_txid_t transaction_id() const { return transaction_id_; } |
| |
| private: |
| // Only our slab allocators is allowed to construct us, and only the |
| // unique_ptrs it hands out are allowed to destroy us. |
| friend CodecCmdJobAllocator; |
| friend fbl::unique_ptr<CodecCmdJob>; |
| |
| CodecCmdJob(CodecCommand cmd) : cmd_(cmd) { } |
| CodecCmdJob(fbl::RefPtr<dispatcher::Channel>&& response_channel, |
| uint32_t transaction_id, |
| CodecCommand cmd) |
| : cmd_(cmd), |
| transaction_id_(transaction_id), |
| response_channel_(std::move(response_channel)) { } |
| |
| ~CodecCmdJob() = default; |
| |
| const CodecCommand cmd_; |
| const zx_txid_t transaction_id_ = IHDA_INVALID_TRANSACTION_ID; |
| fbl::RefPtr<dispatcher::Channel> response_channel_ = nullptr; |
| }; |
| |
| } // namespace intel_hda |
| } // namespace audio |
| |
| // Let users of the slab allocator know that the storage for the allocator is |
| // instantiated in a separate translation unit. |
| FWD_DECL_STATIC_SLAB_ALLOCATOR(::audio::intel_hda::CodecCmdJobAllocTraits); |